定義
為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口绪撵,而且無須指定它們的具體類
抽象工廠是工廠方法的升級(jí)版涤浇,處理的多個(gè)產(chǎn)品,若只有一個(gè)產(chǎn)品裕菠,變化成工廠方法
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
- 高層模塊不依賴具體實(shí)現(xiàn)删顶,依賴是抽象類/接口
- 封裝性,具體構(gòu)造都封裝在具體實(shí)現(xiàn)工廠淑廊,高層模塊不需要知道如何創(chuàng)建
- 產(chǎn)品等級(jí)容易擴(kuò)展(例如條件一個(gè)小米手機(jī)逗余,只需要添加XiaoMiFactory和具體相應(yīng)的產(chǎn)品族)
- 缺點(diǎn)
- 產(chǎn)品族擴(kuò)展非常困難(例如需要添加RAM,抽象工廠季惩,所有實(shí)現(xiàn)工廠都需要修改录粱,違反開閉原則)
角色
- 客戶端 --> 抽象工廠腻格,具體工廠, 抽象產(chǎn)品
- 抽象產(chǎn)品 --> 具體產(chǎn)品
- 具體產(chǎn)品
- 抽象工廠 --> 抽象產(chǎn)品
- 具體工廠 --> 抽象產(chǎn)品啥繁,具體產(chǎn)品
代碼
- 抽象產(chǎn)品
public abstract class Screen
{
public abstract void Show();
}
public abstract class CPU
{
public abstract void Show();
}
- 具體產(chǎn)品
public class SamsungScreen : PhoneAbstract.Screen
{
public override void Show()
{
System.Console.WriteLine("使用三星屏幕");
}
}
public class LGScreen : PhoneAbstract.Screen
{
public override void Show()
{
System.Console.WriteLine("使用LG屏幕");
}
}
- 抽象工廠
public abstract class PhoneFactory
{
public abstract PhoneAbstract.Screen GetScreen();
public abstract PhoneAbstract.CPU GetCPU();
}
- 具體工廠
public class IPhoneFactory : PhoneFactory
{
public override CPU GetCPU()
{
return new Phone.ASeriesCPU();
}
public override Screen GetScreen()
{
return new Phone.SamsungScreen();
}
}
public class HWPhoneFactory : PhoneFactory
{
public override CPU GetCPU()
{
return new Phone.KirinCPU();
}
public override Screen GetScreen()
{
return new Phone.LGScreen();
}
}
- 客戶端
Console.WriteLine("-------- IPhone 手機(jī) --------");
var iphoneFactory = new Factory.IPhoneFactory();
iphoneFactory.GetScreen().Show();
iphoneFactory.GetCPU().Show();
Console.WriteLine(Environment.NewLine + "-------- HUAWEI 手機(jī) --------");
var hwFactory = new Factory.HWPhoneFactory();
hwFactory.GetScreen().Show();
hwFactory.GetCPU().Show();
總結(jié)
抽象工廠是工廠方法的升級(jí)版菜职,適合一個(gè)對(duì)象族(或是一組沒有任何關(guān)系的對(duì)象)都有相同的約束,則可以使用抽象工廠模式