목차
싱글턴 모드
싱글턴 패턴이 무엇인가요?
代码实现
우선 프록시 함수라고 불리는 이유는 이 함수가 싱글톤 모드의 효과를 얻을 수 있도록 도와주기 때문입니다. createOldestMan()은 즉시 실행 함수입니다. 즉시 함수는 선언과 동시에 실행됩니다. 즉, 이 함수는 createOldestMan이 선언될 때 실행되며 인스턴스 변수를 선언한 다음 createOldestMan에 함수를 반환합니다. createOldestMan은
웹 프론트엔드 JS 튜토리얼 JavaScript 디자인 패턴 시리즈 2: 싱글톤 패턴

JavaScript 디자인 패턴 시리즈 2: 싱글톤 패턴

Apr 02, 2018 pm 01:55 PM
javascript js 디자인 패턴

이 글에서는 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 개념이 사용된다는 것입니다.

폐쇄란 무엇인가요? 함수가 정의된 구문 범위 외부에서 호출될 때 클로저가 발생하지만 여전히 정의된 구문 범위에 액세스할 수 있다는 점만 기억하면 됩니다.

코드를 살펴보겠습니다. 함수는 먼저 인스턴스를 정의한 다음 함수(이름)를 반환합니다. 이 함수(이름)에는 인스턴스 변수가 사용됩니다. 정상적인 상황에서는 함수가 즉시 실행된 후 인스턴스 변수가 JavaScript 가비지 수집 메커니즘에 의해 재활용되지만 function(name)은 외부로 반환되고 function(name)은 언제든지 호출되므로 인스턴스는 언제든지 변수에 액세스되므로 인스턴스 변수는 메모리에 유지됩니다. 이렇게 하면 클로저가 생성됩니다. 즉, function(name)은 외부 createOldestMan에 할당되어 외부 구문 범위에서 실행되지만, 정의 시에는 내부 구문 범위의 인스턴스에 접근할 수도 있습니다.

그래서 즉시 실행 함수클로저 작업에서 인스턴스는 한 번만 적용됩니다. 즉, 인스턴스가 하나만 있습니다. 즉, createOldestMan("...")을 몇 번이나 실행하더라도 인스턴스는 처음의 값만 됩니다. 따라서 인스턴스가 인스턴스화되었는지 확인하고 인스턴스에 값을 할당할 수 있습니다. 인스턴스가 인스턴스화되면 인스턴스를 반환합니다. 이는 클래스의 인스턴스를 하나만 갖는 효과를 얻습니다.

범용 싱글톤 패턴


코드를 수정할 수도 있습니다. 개발 중에 싱글톤이 하나만 있을 수 없기 때문에 코드를 모든 싱글톤에 대해 범용으로 만들어야 합니다. 어디서 바꿔볼까요? 그렇군요. 프록시 기능을 변경해 보세요. 프록시 함수에서 oldMan()만 추출하고,oldMan()에 국한되지 않고 매개변수 형식으로 전달될 값을 변경하면 됩니다.

rrreee

이 방법으로 싱글톤을 매개변수로 전달하고 이를 사용하여 다양한 싱글톤을 구현할 수 있습니다.
전체 코드는 다음과 같습니다.

rrreee🎜마찬가지로 createSingleton이 다시 호출되어 다른 값이 전달되더라도 출력은 여전히 ​​첫 번째 "holz"입니다. 🎜🎜🎜요약🎜🎜싱글턴 패턴의 정의: 클래스는 단 하나의 인스턴스만 가지며 전역적으로 액세스할 수 있습니다. 🎜적용 가능한 시나리오: 실제로 싱글톤 모드는 다양한 플로팅 창, 로그인 플로팅 창 등 일상적인 개발에 널리 사용됩니다. 아무리 클릭해도 동일한 플로팅 창은 한 번만 생성됩니다. . 이 시나리오는 싱글톤 모드를 사용하는 데 매우 적합합니다. 🎜🎜관련 추천: 🎜🎜🎜JavaScript 디자인 패턴 시리즈 1: 팩토리 패턴🎜🎜🎜🎜🎜🎜🎜🎜

위 내용은 JavaScript 디자인 패턴 시리즈 2: 싱글톤 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Java 프레임워크의 디자인 패턴과 아키텍처 패턴의 차이점 Java 프레임워크의 디자인 패턴과 아키텍처 패턴의 차이점 Jun 02, 2024 pm 12:59 PM

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

Java 디자인 패턴의 데코레이터 패턴 분석 Java 디자인 패턴의 데코레이터 패턴 분석 May 09, 2024 pm 03:12 PM

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

Java 디자인 패턴에서 어댑터 패턴의 놀라운 사용 Java 디자인 패턴에서 어댑터 패턴의 놀라운 사용 May 09, 2024 pm 12:54 PM

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

PHP 디자인 패턴 실제 사례 분석 PHP 디자인 패턴 실제 사례 분석 May 08, 2024 am 08:09 AM

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

PHP 디자인 패턴: 실제 테스트 중심 개발 PHP 디자인 패턴: 실제 테스트 중심 개발 Jun 03, 2024 pm 02:14 PM

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

디자인 패턴이 코드 유지 관리 문제를 처리하는 방법 디자인 패턴이 코드 유지 관리 문제를 처리하는 방법 May 09, 2024 pm 12:45 PM

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

Java 프레임워크에서 디자인 패턴을 사용할 때의 장점과 단점은 무엇입니까? Java 프레임워크에서 디자인 패턴을 사용할 때의 장점과 단점은 무엇입니까? Jun 01, 2024 pm 02:13 PM

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

Guice 프레임워크에 디자인 패턴 적용 Guice 프레임워크에 디자인 패턴 적용 Jun 02, 2024 pm 10:49 PM

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

See all articles