# Chapter4: 單例/獨體模式 (Singleton)

## This section contain the following items:

* 1.Singleton Pattern
* 2.Singleton Pattern Example for javascript
* 3.Singleton Pattern Example for C#

## 1.Singleton Pattern

* 單例/獨體模式的核心概念
  * 滿足以下兩個條件
    * 1.提供一個全域的存取點(access point)
    * 2.一個類別只會有一個實例
* 單例/獨體模式所要解決的問題(痛點)
  * 以javascript為例
    * 問題與挑戰
      * 例如瀏覽器中的windows物件, 或是設計只出現一次彈跳視窗, 執行續池, 全域快取等
    * 1.建立一個單例物件
      * 封裝成可以使用new建構子來建立單例物件

        [![](https://1330730840-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8D7wlLIQ3stULq%2F-M4M0IKc4rWLYnAL_jem%2F-M4M0Lj1m8mK62dWQ0Bz%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202017-03-30%20%E4%B8%8B%E5%8D%883.57.11.png?generation=1586302917975149\&alt=media)](http://codepen.io/JenHsuan/pen/ryQdVZ?editors=0011)
    * 2.惰性單例

      * 載入時就建立, 每次使用時判斷是否instance已存在 -> 按按鈕才會建立實體, 每次使用時判斷是否instance已存在 -> 將獨體邏輯與建立邏輯分開來

      [![](https://1330730840-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8D7wlLIQ3stULq%2F-M4M0IKc4rWLYnAL_jem%2F-M4M0Lj3G80kaw7G64gV%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202017-03-30%20%E4%B8%8B%E5%8D%882.56.32.png?generation=1586302918244738\&alt=media)](http://codepen.io/JenHsuan/pen/LWJpyx?editors=0011)

      [![](https://1330730840-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8D7wlLIQ3stULq%2F-M4M0IKc4rWLYnAL_jem%2F-M4M0Lj563nAWAVsKilG%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202017-03-30%20%E4%B8%8B%E5%8D%882.57.20.png?generation=1586302918173580\&alt=media)](http://codepen.io/JenHsuan/pen/LWJpyx?editors=0011)

      [![](https://1330730840-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8D7wlLIQ3stULq%2F-M4M0IKc4rWLYnAL_jem%2F-M4M0Lj7SH9c9J01XD4T%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202017-03-30%20%E4%B8%8B%E5%8D%882.58.08.png?generation=1586302917998962\&alt=media)](http://codepen.io/JenHsuan/pen/LWJpyx?editors=0011)
    * 3.封裝私有變數

      * 為了不讓全域變數污染, 或讓其污染降到最低, 可以封裝起來

      [![](https://1330730840-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8D7wlLIQ3stULq%2F-M4M0IKc4rWLYnAL_jem%2F-M4M0Lj91J2lvE--ychK%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202017-03-30%20%E4%B8%8B%E5%8D%883.05.29.png?generation=1586302918013144\&alt=media)](http://codepen.io/JenHsuan/pen/EWOQKb?editors=0012)
* 以C#為例
  * Class Diagram&#x20;
    * 只有getInstance()一個函式, 而且沒有公開的建構子
  * 問題與挑戰
    * 多執行緒時的同步問題與效能問題

## 2.Singleton Pattern Example for javascript

## 3.Singleton Pattern Example for C\#
