再延續昨天的例子,今天的我終於下定決心要減肥了,我規定我一天只能喝一杯奶茶,所以如果去買奶茶的話,店員只會給我一杯,如果再要第二杯,店員只會把剛剛做好的第一杯再給我一次,他回傳的永遠是第一杯製作來的奶茶,而把他套用到程式中,就是「Singleton」模式。
保證一個類別僅有一個實體,並提供一個存取它的全域存取點。
(圖片來源:https://miro.medium.com/max/720/1*Emru7-sr_AEKrIzgiLROAA.png)
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;
}
}
}
}
Singleton 模式的工作原理是:用一個特殊方法來實體化所需的物件。
由於性能的原因,我可能不希望反覆地實體化、然後再銷毀這些物件。雖然可以在開始時實體化所有可能的策略物件,但如果策略越來越多,如此做的效率將很低。相反,最好依需要實體化,而且只進行一次。