定義
定義一個(gè)用于創(chuàng)建對(duì)象的接口凰盔,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)砚嘴。工廠方法使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
針對(duì)簡(jiǎn)單工廠不容易擴(kuò)展禾嫉,工廠方法將實(shí)例化延遲到子類(lèi)工廠,從而提供擴(kuò)展
- 缺點(diǎn)
每次新增產(chǎn)品都需要添加工廠和具體產(chǎn)品類(lèi)寂纪,增加系統(tǒng)復(fù)雜性
角色
- 客戶端 --> 抽象工廠席吴,具體工廠, 抽象產(chǎn)品
- 抽象產(chǎn)品 --> 具體產(chǎn)品
- 具體產(chǎn)品
- 抽象工廠 --> 抽象產(chǎn)品
- 具體工廠 --> 抽象產(chǎn)品捞蛋,具體產(chǎn)品
代碼
- 抽象產(chǎn)品
public abstract class Phone
{
public abstract void Call();
}
- 具體產(chǎn)品
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();
簡(jiǎn)單工廠 VS 工廠方法
假設(shè)現(xiàn)在需要擴(kuò)展手機(jī)產(chǎn)品孝冒,增加鴻蒙OS手機(jī)
- 簡(jiǎn)單工廠
- 增加具體手機(jī)類(lèi)
HarmonyPhone
- 修改靜態(tài)工廠方法增加HarmonyPhone判斷(違反開(kāi)閉原則)
- 工廠方法
- 增加具體手機(jī)類(lèi)
HarmonyPhone
- 增加具體工廠類(lèi)
HarmonyFactory
總結(jié)
工廠方法模式是典型的解耦框架,通過(guò)增加抽象工廠拟杉,客戶端與具體產(chǎn)品解耦庄涡,抽象工廠與具體產(chǎn)品解構(gòu)
符合迪米特法則,不需要知道具體產(chǎn)品如何構(gòu)造
符合依賴倒置原則搬设,只依賴產(chǎn)品類(lèi)的抽象
符合里氏替換原則穴店,父類(lèi)出現(xiàn)的地方都可以用子類(lèi)替換,因?yàn)闆](méi)有破壞繼承體系
當(dāng)然最重要復(fù)合開(kāi)閉原則拿穴,當(dāng)需要擴(kuò)展產(chǎn)品時(shí)泣洞,并不需要改動(dòng)原來(lái)代碼,只需增加新的具體產(chǎn)品類(lèi)默色,具體工廠類(lèi)