iT邦幫忙

2022 iThome 鐵人賽

DAY 16
1

再延續昨天的例子,今天的我終於下定決心要減肥了,我規定我一天只能喝一杯奶茶,所以如果去買奶茶的話,店員只會給我一杯,如果再要第二杯,店員只會把剛剛做好的第一杯再給我一次,他回傳的永遠是第一杯製作來的奶茶,而把他套用到程式中,就是「Singleton」模式。

Singleton - 定義

保證一個類別僅有一個實體,並提供一個存取它的全域存取點。

https://ithelp.ithome.com.tw/upload/images/20220922/20136443SJaVhZhfO6.png

(圖片來源:https://miro.medium.com/max/720/1*Emru7-sr_AEKrIzgiLROAA.png)

範例 UML

https://ithelp.ithome.com.tw/upload/images/20220925/20136443jDxg056tV9.png

不囉嗦上Code!

using System;

namespace DAY16_Singleton
{
    internal class Program
    {
        static void Main(string[] args)
        {
            MilkTea.GetDrink();
            MilkTea.GetDrink();
            MilkTea.GetDrink();
            MilkTea.GetDrink();
        }

        public class MilkTea
        {
            // 利用靜態變數記綠 MilkTea 實體
            private static MilkTea _milkTea;

            // 建構式宣告為 private,只讓 MilkTea 類別內能使用
            private MilkTea() { }

            // 公開的靜態方法,要呼叫物件只能使用此方法
            public static MilkTea GetDrink()
            {
                // 判斷是否建立過,沒有就建立 MilkTea 實體
                if (_milkTea == null)
                {
                    _milkTea = new MilkTea();
                    Console.WriteLine("奶茶做完了,一天只能一杯");
                }
                else
                {
                    Console.WriteLine("今天奶茶的扣打已經用完囉!");
                }
                return _milkTea;
            }
        }
    }
}
  • 結果

https://ithelp.ithome.com.tw/upload/images/20220922/20136443tXDe4ALJca.png

簡單的小結

Singleton 模式的工作原理是:用一個特殊方法來實體化所需的物件。

  • 呼叫這個方法時,檢查物件是否已經實體化。如果已經實體化,該方法僅返回對該物件的一個參照。如果尚未實體化,該方法實體化該物件並返回對此新實體的一個參照。
  • 為了確保這是實體化此類型物件的唯一方法,這個類別的構造函數定義為保護或者私有的。

由於性能的原因,我可能不希望反覆地實體化、然後再銷毀這些物件。雖然可以在開始時實體化所有可能的策略物件,但如果策略越來越多,如此做的效率將很低。相反,最好依需要實體化,而且只進行一次。


上一篇
【DAY15】Template模式 - 那些年,我們一起搖的飲料(下)
下一篇
【DAY17】Double-Checked Locking模式 - 多執行序環境
系列文
勇闖秘境!探索物件導向背後的設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言