JavaScript 디자인 패턴 시리즈 2: 싱글톤 패턴
이 글에서는 JavaScript 디자인 패턴의 두 번째 시리즈인 싱글턴 모드를 공유합니다. 관심 있는 친구들은 한 번 살펴보세요.
싱글턴 모드
서문: 이 시리즈의 코드는 GitHub 주소 https://github에 업로드되었습니다. .com/HolyZheng/…
싱글턴 패턴이 무엇인가요?
싱글턴 패턴의 정의
: 클래스는 하나의 인스턴스만 가지며 전역적으로 액세스할 수 있습니다
. 单例模式
的定义:一个类仅有一个实例,并且可以在全局访问
。
什么时候需要用到单例模式呢?其实单例模式在日常开发中的使用非常的广泛,例如各种浮窗、像登录浮窗等,无论我们点击多少次,都是同一个浮窗,浮窗从始至终只创建了一次。这种场景就十分适合运用单例模式。
代码实现
我们创建一个“最老的人”的类,很明显,“最老的人”有且只有一个。这很符合我们单例模式的运用场景。我们先来看看完整代码:
var oldestMan = function (name) { this.name = name; } oldestMan.prototype.getName = function () { console.log(this.name); } //引入一个代理函数和闭包的概念 var createOldestMan = (function () { var instance; return function (name) { if (!instance) { instance = new oldestMan(name); } return instance; } })(); var personA = createOldestMan("holz"); var personB = createOldestMan("Amy"); personA.getName(); // holz personB.getName(); // holz
我们可以在控制台上看到即使调用了两次createOldestMan
并且赋了不一样的值,但两次getName()
输出的都是第一次的“holz”。这就是单例模式。
代码看不太懂?没关系,现在给大家一一讲解。
首先我们创建了一个oldestMan类,创建了一个name属性。然后我们通过 prototype
给它添加一个getName()方法用来获取oldestMan的名字,相信到这里大家都是懂的,然后下面一段代码就是重点了,也比较难理解。我们打这段代码单独拿出来将一下。
//引入一个代理函数和闭包的概念 var createOldestMan = (function () { var instance; return function (name) { if (!instance) { instance = new oldestMan(name); } return instance; } })();
首先,我们不用管什么是代理函数,之所以叫它代理函数是因为它辅助我们实现单例模式的效果,这段函数第一个关键点是 createOldestMan()
是一个立即执行函数。立即函数在声明的时候就会立即执行,也就是在声明createOldestMan的时候这个函数就会执行,它会声明一个instance 变量,然后返回一个函数给createOldestMan。createOldestMan就相当于:
var createOldestMan = function (name) { if (!instance) { instance = new oldestMan(name); } return instance; }
第二个关键点是:这里利用了 闭包
的概念。
闭包是什么呢?我只需要记住当函数在定义时的语法作用域之外被调用,却还能访问定义时的语法作用域时,就是产生了闭包。
我们来看一下我们的代码,函数先定义了一个instance,然后再返回一个function(name),这个function(name)里面用到了instance变量。在正常情况下,在立即执行函数执行之后,instance变量就会被JavaScript的垃圾回收机制回收,但是因为function(name)被返回到了外部,而function(name)随时会被调用,随时会访问到instance变量,所以instance变量被保留在了内存中。这就产生了闭包。也就是说,function(name)被赋值给了外部的createOldestMan,在外部的语法作用域中执行,但还可以访问到定义时内部的语法作用域中的instance。
所以在 立即执行函数
和 闭包
싱글턴 패턴은 언제 사용해야 하나요? 실제로 싱글톤 모드는 로그인 플로팅 창 등 다양한 플로팅 창 등 일상적인 개발에 널리 사용됩니다. 아무리 클릭해도 동일한 플로팅 창이며 플로팅 창은 한 번만 생성됩니다. 처음부터 끝까지. 이 시나리오는 싱글톤 모드를 사용하는 데 매우 적합합니다.
var singleObj; var createSingleton = function (fn) { return function (text) { if (!singleObj) { singleObj = new fn (text); } return singleObj; } }
콘솔에서
createOldestMan
이 두 번 호출되고 다른 값이 할당되었음에도 불구하고 getName()< / code>출력은 모두 첫 번째 "holz"입니다. 이것이 싱글턴 패턴이다. </p><p>코드를 이해할 수 없나요? 상관없습니다. 이제 하나씩 설명하겠습니다. </p> 먼저 oldMan 클래스와 name 속성을 만들었습니다. 그런 다음 <code>prototype
을 통해 여기에 getName() 메서드를 추가하여 oldMan의 이름을 가져옵니다. 여기서는 모두가 이해한다고 생각합니다. 그러면 다음 코드 부분이 초점이 되며 더 어렵습니다. 이해하다. 이 코드 조각을 꺼내서 별도로 살펴보겠습니다. var oldestMan = function (name) { this.name = name; } oldestMan.prototype.getName = function () { console.log(this.name); } //一个通用的代理函数 var singleObj; var createSingleton = function (fn) { return function (text) { if (!singleObj) { singleObj = new fn (text); } return singleObj; } } var person_1 = createSingleton(oldestMan)("holz"); var person_2 = createSingleton(oldestMan)("tom"); person_1.getName(); //holz person_2.getName(); //holz
우선 프록시 함수라고 불리는 이유는 이 함수가 싱글톤 모드의 효과를 얻을 수 있도록 도와주기 때문입니다. createOldestMan()
은 즉시 실행 함수입니다. 즉시 함수는 선언과 동시에 실행됩니다. 즉, 이 함수는 createOldestMan이 선언될 때 실행되며 인스턴스 변수를 선언한 다음 createOldestMan에 함수를 반환합니다. createOldestMan은
rrreee와 동일합니다. 두 번째 핵심 사항은 여기서 closure
개념이 사용된다는 것입니다.
코드를 수정할 수도 있습니다. 개발 중에 싱글톤이 하나만 있을 수 없기 때문에 코드를 모든 싱글톤에 대해 범용으로 만들어야 합니다. 어디서 바꿔볼까요? 그렇군요. 프록시 기능을 변경해 보세요. 프록시 함수에서 oldMan()만 추출하고,oldMan()에 국한되지 않고 매개변수 형식으로 전달될 값을 변경하면 됩니다.
이 방법으로 싱글톤을 매개변수로 전달하고 이를 사용하여 다양한 싱글톤을 구현할 수 있습니다.
전체 코드는 다음과 같습니다.
위 내용은 JavaScript 디자인 패턴 시리즈 2: 싱글톤 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java 프레임워크에서 디자인 패턴과 아키텍처 패턴의 차이점은 디자인 패턴이 클래스와 객체(예: 팩토리 패턴) 간의 상호 작용에 중점을 두고 소프트웨어 디자인의 일반적인 문제에 대한 추상적인 솔루션을 정의한다는 것입니다. 아키텍처 패턴은 계층화된 아키텍처와 같은 시스템 구성 요소의 구성 및 상호 작용에 중점을 두고 시스템 구조와 모듈 간의 관계를 정의합니다.

데코레이터 패턴은 원래 클래스를 수정하지 않고도 객체 기능을 동적으로 추가할 수 있는 구조적 디자인 패턴입니다. 추상 컴포넌트, 콘크리트 컴포넌트, 추상 데코레이터, 콘크리트 데코레이터의 협업을 통해 구현되며, 변화하는 요구에 맞게 클래스 기능을 유연하게 확장할 수 있습니다. 이 예에서는 우유와 모카 데코레이터가 총 $2.29의 가격으로 Espresso에 추가되어 객체의 동작을 동적으로 수정하는 데코레이터 패턴의 힘을 보여줍니다.

어댑터 패턴은 호환되지 않는 개체가 함께 작동할 수 있도록 하는 구조적 디자인 패턴입니다. 이는 개체가 원활하게 상호 작용할 수 있도록 하나의 인터페이스를 다른 인터페이스로 변환합니다. 개체 어댑터는 적응된 개체를 포함하는 어댑터 개체를 만들고 대상 인터페이스를 구현하여 어댑터 패턴을 구현합니다. 실제적인 경우 클라이언트(예: MediaPlayer)는 어댑터 모드를 통해 고급 형식 미디어(예: VLC)를 재생할 수 있지만 클라이언트 자체는 일반 미디어 형식(예: MP3)만 지원합니다.

1. 팩토리 패턴: 객체 생성과 비즈니스 로직을 분리하고, 팩토리 클래스를 통해 지정된 형태의 객체를 생성합니다. 2. 관찰자 패턴: 주체 개체가 관찰자 개체에 상태 변경을 알리도록 허용하여 느슨한 결합 및 관찰자 패턴을 달성합니다.

TDD는 고품질 PHP 코드를 작성하는 데 사용됩니다. 단계에는 테스트 사례 작성, 예상 기능 설명 및 실패 만들기가 포함됩니다. 과도한 최적화나 세부 설계 없이 테스트 케이스만 통과하도록 코드를 작성합니다. 테스트 케이스를 통과한 후 코드를 최적화하고 리팩터링하여 가독성, 유지 관리성 및 확장성을 향상시킵니다.

디자인 패턴은 재사용 및 확장 가능한 솔루션을 제공하여 코드 유지 관리 문제를 해결합니다. 관찰자 패턴: 개체가 이벤트를 구독하고 이벤트가 발생할 때 알림을 받을 수 있도록 합니다. 팩토리 패턴: 구체적인 클래스에 의존하지 않고 객체를 생성하는 중앙 집중식 방법을 제공합니다. 싱글톤 패턴: 클래스에 전역적으로 액세스 가능한 개체를 만드는 데 사용되는 인스턴스가 하나만 있는지 확인합니다.

Java 프레임워크에서 디자인 패턴을 사용하면 향상된 코드 가독성, 유지 관리성 및 확장성이 향상된다는 이점이 있습니다. 단점으로는 복잡성, 성능 오버헤드, 과도한 사용으로 인한 가파른 학습 곡선 등이 있습니다. 실제 사례: 프록시 모드는 개체를 지연 로드하는 데 사용됩니다. 디자인 패턴을 현명하게 사용하여 장점을 활용하고 단점을 최소화하세요.

Guice 프레임워크는 다음을 포함한 다양한 디자인 패턴을 적용합니다. 싱글톤 패턴: @Singleton 주석을 통해 클래스에 인스턴스가 하나만 있는지 확인합니다. 팩토리 메소드 패턴: @Provides 주석을 통해 팩토리 메소드를 생성하고 종속성 주입 중에 객체 인스턴스를 얻습니다. 전략 모드: 알고리즘을 다양한 전략 클래스로 캡슐화하고 @Named 주석을 통해 특정 전략을 지정합니다.
