本文為轉(zhuǎn)載飒硅,原文C#實(shí)現(xiàn)設(shè)計(jì)模式 —— 抽象工廠模式
介紹
定義
抽象工廠模式
(Abstract Factory Pattern):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類巷波。抽象工廠模式又稱為Kit模式沧竟,屬于對象創(chuàng)建型模式。
模式動(dòng)機(jī)
在工廠方法模式中具體工廠負(fù)責(zé)生產(chǎn)具體的產(chǎn)品,每一個(gè)具體工廠對應(yīng)一種具體產(chǎn)品燃乍,工廠方法也具有唯一性,一般情況下宛琅,一個(gè)具體工廠中只有一個(gè)工廠方法或者一組重載的工廠方法刻蟹。但是有時(shí)候我們需要一個(gè)工廠可以提供多個(gè)產(chǎn)品對象,而不是單一的產(chǎn)品對象嘿辟。
為了更清晰地理解工廠方法模式舆瘪,需要先引入兩個(gè)概念:
產(chǎn)品等級結(jié)構(gòu)
:產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個(gè)抽象類是電視機(jī)红伦,其子類有海爾電視機(jī)英古、海信電視機(jī)、TCL電視機(jī)昙读,則抽象電視機(jī)與具體品牌的電視機(jī)之間構(gòu)成了一個(gè)產(chǎn)品等級結(jié)構(gòu)召调,抽象電視機(jī)是父類,而具體品牌的電視機(jī)是其子類蛮浑。產(chǎn)品族
:在抽象工廠模式中唠叛,產(chǎn)品族是指由同一個(gè)工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品沮稚,如海爾電器工廠生產(chǎn)的海爾電視機(jī)艺沼、海爾電冰箱,海爾電視機(jī)位于電視機(jī)產(chǎn)品等級結(jié)構(gòu)中壮虫,海爾電冰箱位于電冰箱產(chǎn)品等級結(jié)構(gòu)中澳厢。
產(chǎn)品族與產(chǎn)品等級結(jié)構(gòu)示意圖:
[圖片上傳失敗...(image-a5a72a-1514254350084)]
當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡單的對象环础,而是多個(gè)位于不同產(chǎn)品等級結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時(shí)需要使用抽象工廠模式。
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)剩拢。
抽象工廠模式與工廠方法模式最大的區(qū)別在于线得,工廠方法模式針對的是一個(gè)產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則需要面對多個(gè)產(chǎn)品等級結(jié)構(gòu)徐伐,一個(gè)工廠等級結(jié)構(gòu)可以負(fù)責(zé)多個(gè)不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建 贯钩。當(dāng)一個(gè)工廠等級結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級結(jié)構(gòu)的一個(gè)產(chǎn)品族中的所有對象時(shí),抽象工廠模式比工廠方法模式更為簡單办素、有效率角雷。
模式結(jié)構(gòu)
抽象工廠模式包含如下角色:
抽象工廠
(Abstract Factory):聲明生成一系列抽象產(chǎn)品的方法
具體工廠
(Concrete Factory):執(zhí)行生成一系列抽象產(chǎn)品的方法,生成一系列具體的產(chǎn)品
抽象產(chǎn)品
(Abstract Product):為這一系列的某一種產(chǎn)品聲明接口
具體產(chǎn)品
(Product):定義具體工廠生成的具體產(chǎn)品的對象性穿,實(shí)現(xiàn)產(chǎn)品接口
客戶
(Client):我們的應(yīng)用程序客戶端(不要理解成人)勺三,使用抽象產(chǎn)品和抽象工廠生成對象。
示例代碼
抽象工廠
public interface ICarFactory
{
IEngine CreateEngine();
ISeat CreateSeat();
}
具體工廠:
public class CarAFactory : ICarFactory
{
public IEngine CreateEngine()
{
return new EngineA();
}
public ISeat CreateSeat()
{
return new SeatA();
}
}
public class CarBFactory : ICarFactory
{
public IEngine CreateEngine()
{
return new EngineB();
}
public ISeat CreateSeat()
{
return new SeatB();
}
}
抽象產(chǎn)品:
public interface IEngine
{
void Run();
}
public interface ISeat
{
void Message();
}
具體產(chǎn)品:
public class EngineA : IEngine
{
public void Run()
{
Console.WriteLine("this is engine A");
}
}
public class EngineB : IEngine
{
public void Run()
{
Console.WriteLine("this is engine b");
}
}
public class SeatA : ISeat
{
public void Message()
{
Console.WriteLine("this is seat a");
}
}
public class SeatB : ISeat
{
public void Message()
{
Console.WriteLine("this is seat b");
}
}
調(diào)用方:
static void Main(string[] args)
{
List<(string, Action)> sss = new List<(string, Action)>();
sss.Add(("1", SimpleFactory));
sss[0].Item2();
bool flag = true;
while (flag)
{
Console.WriteLine("=================設(shè)計(jì)模式測試=================");
Console.WriteLine("====1 - 簡單工廠模式==========================");
Console.WriteLine("====2 - 工廠方法模式==========================");
Console.WriteLine("====3 - 抽象工廠模式==========================");
Console.WriteLine("====0 - 退出==================================");
Console.WriteLine("==============================================");
Console.Write("請輸入編號:");
string num = Console.ReadLine();
switch (num)
{
case "1":
SimpleFactory();
break;
case "2":
FactoryMethod();
break;
case "3":
AbstractFactory();
break;
case "0":
flag = false;
break;
default:
break;
}
Console.WriteLine("\r\n");
}
}
static void AbstractFactory()
{
ICarFactory cara = new CarAFactory();
IEngine e1 = cara.CreateEngine();
ISeat s1 = cara.CreateSeat();
e1.Run();
s1.Message();
ICarFactory carab = new CarBFactory();
IEngine e2 = carab.CreateEngine();
ISeat s2 = carab.CreateSeat();
e2.Run();
s2.Message();
}
結(jié)果: