【設(shè)計(jì)模式】抽象工廠

定義


為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無(wú)須指定它們的具體類

抽象工廠是工廠方法的升級(jí)版,處理的多個(gè)產(chǎn)品,若只有一個(gè)產(chǎn)品,變化成工廠方法

優(yōu)缺點(diǎn)


  • 優(yōu)點(diǎn)
  1. 高層模塊不依賴具體實(shí)現(xiàn),依賴是抽象類/接口
  2. 封裝性,具體構(gòu)造都封裝在具體實(shí)現(xiàn)工廠,高層模塊不需要知道如何創(chuàng)建
  3. 產(chǎn)品等級(jí)容易擴(kuò)展(例如條件一個(gè)小米手機(jī),只需要添加X(jué)iaoMiFactory和具體相應(yīng)的產(chǎn)品族)
  • 缺點(diǎn)
  1. 產(chǎn)品族擴(kuò)展非常困難(例如需要添加RAM,抽象工廠,所有實(shí)現(xiàn)工廠都需要修改,違反開(kāi)閉原則)

角色


  • 客戶端 --> 抽象工廠,具體工廠, 抽象產(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ì)象族(或是一組沒(méi)有任何關(guān)系的對(duì)象)都有相同的約束,則可以使用抽象工廠模式


示例代碼 - Github

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容