天天看點

設計模式成長記(一) 抽象工廠模式(Abstract Factory)

提供一個建立一系列相關或互相依賴的對象的接口,而無需指定具體的類。

目錄

  • 定義
  • UML類圖
  • 參與者
  • 編寫代碼
  • 特點

使用頻率:

設計模式成長記(一) 抽象工廠模式(Abstract Factory)

設計模式成長記(一) 抽象工廠模式(Abstract Factory)

AbstractFactory:聲明一個建立抽象産品的的接口。

ConcreteFactory:實作接口建立具體的産品對象。

AbstractProduct:産品的抽象。

Product:具體的産品,實作抽象産品的接口。

Client:使用抽象工廠和抽象産品。

1.建立控制台程式AbstractFactory,新增Abstract.cs類檔案

using System;


/// <summary>
/// 抽象工程模式:提供一個建立一系列相關或互相依賴對象的接口,而無須指定具體的類。
/// </summary>
namespace AbstractFactory
{
    /// <summary>
    /// 抽象産品A
    /// </summary>
    public abstract class AbstractProductA
    {
        public abstract void SayHello();
    }

    /// <summary>
    /// 抽象産品B
    /// </summary>
    public abstract class AbstractProductB
    {
        public abstract void SayHello();
    }

    /// <summary>
    /// 具體産品A1
    /// </summary>
    public class ProductA1 : AbstractProductA
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具體産品A1");
        }
    }

    /// <summary>
    /// 具體産品A2
    /// </summary>
    public class ProductA2 : AbstractProductA
    {

        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具體産品A2");
        }
    }

    /// <summary>
    /// 具體産品B1
    /// </summary>
    public class ProductB1 : AbstractProductB
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具體産品B1");
        }
    }

    /// <summary>
    /// 具體産品B2
    /// </summary>
    public class ProductB2 : AbstractProductB
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具體産品B2");
        }
    }

    /// <summary>
    /// 抽象工廠:提供建立抽象産品的接口
    /// </summary>
    public abstract class AbstractFactory
    {
        public abstract AbstractProductA CreateProductA();
        public abstract AbstractProductB CreateProductB();
    }

    /// <summary>
    /// 具體工廠:實作抽象工廠建立産品的接口
    /// </summary>
    public class ConcreteFactory1 : AbstractFactory
    {
        public override AbstractProductA CreateProductA()
        {
            return new ProductA1();
        }

        public override AbstractProductB CreateProductB()
        {
            return new ProductB1();
        }
    }


    public class ConcreteFactory2 : AbstractFactory
    {
        public override AbstractProductA CreateProductA()
        {
            return new ProductA2();
        }

        public override AbstractProductB CreateProductB()
        {
            return new ProductB2();
        }
    }

    public class Client
    {
        private AbstractProductA _productA;
        private AbstractProductB _productB;

        public Client(AbstractFactory factory)
        {
            _productA = factory.CreateProductA();
            _productB = factory.CreateProductB();
        }

        public void Run()
        {
            _productA.SayHello();
            _productB.SayHello();
        }
    }
}      

2.編寫Program.cs

using System;

namespace AbstractFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用工廠1
            AbstractFactory factory = new ConcreteFactory1();
            Client client = new Client(factory);//依賴注入
            client.Run();

            Console.WriteLine();

            //使用工廠2
            factory = new ConcreteFactory2();
            client = new Client(factory);
            client.Run();

            Console.Read();
        }
    }

  
}      

3.輸出結果

設計模式成長記(一) 抽象工廠模式(Abstract Factory)

1) 分離了具體的類

Abstract Factory 模式幫助你控制一個應用建立的對象的類。因為一個工廠封裝建立産品對象的責任和過程,它将客戶與類的實作分離。客戶通過它們的抽象接口操縱執行個體。産品的類名也在具體工廠的實作中被分離;它們不出現在客戶代碼中。

2) 使得易于交換産品系列

一個具體工廠類在一個應用中僅出現一次—即在它初始化的時候。這使得改變一個應用的具體工廠變得很容易。它隻需改變具體的工廠即可使用不同的産品配置,這是因為一個抽象工廠建立了一個完整的産品系列,是以整個産品系列會立刻改變。

3) 有利于産品的一緻性

當一個系列中的産品對象被設計成一起工作時,一個應用一次隻能使用同一個系列中的對象,這一點很重要。而AbstractFactory很容易實作這一點。

4) 難以支援新種類的産品

難以擴充抽象工廠以生産新種類的産品,這是因為AbstractFactory接口确定了可以被建立的産品集合。 支援新種類的産品就需要擴充該工廠接口,這将涉及 AbstractFactory類及其所有子類的改變。

設計模式成長記(一) 抽象工廠模式(Abstract Factory)

我叫劉皓,很高興您能閱讀完我的這篇文章。

我花了大量時間和精力來完成這篇文章,如果文章對您有幫助,請不要忘了點推薦哦!

如果您能點選右邊的打賞按鈕,打賞一杯咖啡錢,我将獲得更多的動力和能量寫出下一篇好文章。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利。

我的部落格即将搬運同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan

繼續閱讀