定義
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類
優(yōu)缺點
針對簡單工廠不容易擴展,工廠方法將實例化延遲到子類工廠,從而提供擴展
每次新增產(chǎn)品都需要添加工廠和具體產(chǎn)品類,增加系統(tǒng)復雜性
角色
- 客戶端 --> 抽象工廠,具體工廠, 抽象產(chǎn)品
- 抽象產(chǎn)品 --> 具體產(chǎn)品
- 具體產(chǎn)品
- 抽象工廠 --> 抽象產(chǎn)品
- 具體工廠 --> 抽象產(chǎn)品,具體產(chǎn)品
代碼
public abstract class Phone
{
public abstract void Call();
}
public class IPhone : Phone
{
public override void Call()
{
System.Console.WriteLine("Call by IPhone");
}
}
public class AndroidPhone : Phone
{
public override void Call()
{
System.Console.WriteLine("Call by Android");
}
}
public abstract class PhoneFactory
{
public abstract Phone Create();
}
public class IPhoneFactory : PhoneFactory
{
public override Phone Create()
{
return new IPhone();
}
}
public class AndroidFactory : PhoneFactory
{
public override Phone Create()
{
return new AndroidPhone();
}
}
Phone phone = new IPhoneFactory().Create();
phone.Call();
phone = new AndroidFactory().Create();
phone.Call();
簡單工廠 VS 工廠方法
假設現(xiàn)在需要擴展手機產(chǎn)品,增加鴻蒙OS手機
- 增加具體手機類
HarmonyPhone
- 修改靜態(tài)工廠方法增加HarmonyPhone判斷(違反開閉原則)
- 增加具體手機類
HarmonyPhone
- 增加具體工廠類
HarmonyFactory
總結(jié)
工廠方法模式是典型的解耦框架,通過增加抽象工廠,客戶端與具體產(chǎn)品解耦,抽象工廠與具體產(chǎn)品解構(gòu)
符合迪米特法則,不需要知道具體產(chǎn)品如何構(gòu)造
符合依賴倒置原則,只依賴產(chǎn)品類的抽象
符合里氏替換原則,父類出現(xiàn)的地方都可以用子類替換,因為沒有破壞繼承體系
當然最重要復合開閉原則,當需要擴展產(chǎn)品時,并不需要改動原來代碼,只需增加新的具體產(chǎn)品類,具體工廠類
示例代碼 - Github
|