抽象工廠-AbstractFactory

設計模式系列

抽象工廠

定義:提供一個建立一系列相關或互相依賴物件的介面,而無需指定它們具體的類別。

解釋:透過定義一個抽象類別或介面(即抽象工廠),規範制定一整套創造抽象物件的方法,以至於在實際
           方法內容在繼承了抽象工廠的實體工廠中實作,並透過多型的能力以統一的抽象工廠外貌來操作不
           同實體工廠的實體化方法,以在不依賴實作類別的情況下創建出不同的物件實體。由於實體工廠了
           解自己要產出的實體類別,在繼承的方法中使用new來實體化需要的實體類別,並以抽象類別的外
           貌從實體工廠中傳遞出去。增加了實體類別中關於創建物件實體的內聚性,降低了類別之間依賴不
           同物件 類型的耦合性。

精神:抽象實體化物件的過程。

目的:避免為了實例化新的類別而去修改原有的實例化程式碼(像是用switch來實體化不同的類別),以遵守
           開閉原則。

使用時機:當有一系列繼承於某個類型(無論抽象或實體)的類型的實體化過程繁複而且相關(不一定只有產品
                  類別本身的實體化,相關的配件實體化的部分也應該放在同一個工廠中)時。

優點:抽象分離、增強内聚性與降低耦合程度。

缺點:需要實作各自的實體工廠,類別數量會增多。而且若要擴充抽象工廠的實例方法需要修改所有繼承的
           類別。

   class Program
    {
        private static void Main(string[] args)
        {
            AbstractFactory factory1 = new ConcreteFacotry1();
            Clinet clinet1 = new Clinet(factory1);
            clinet1.Run();

            AbstractFactory factory2 = new ConcreteFactory2();
            Clinet clinet2 = new Clinet(factory2);
            clinet2.Run();
            Console.ReadLine();
        }
    }

    abstract class AbstractFactory
    {
       public   abstract AbstractProductA CreateProductA();
       public   abstract AbstractProductB CreateProductB();
    }

    class ConcreteFacotry1:AbstractFactory
    {
        public override AbstractProductA CreateProductA()
        {
            return new ProductA1();
        }

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

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

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

    abstract class AbstractProductB
    {
       public  abstract void Interact(AbstractProductA a);
    }

    class ProductA1 : AbstractProductA
    {
    }

    class ProductB1 : AbstractProductB
    {
        public override void Interact(AbstractProductA a)
        {
            Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
        }
    }
    class ProductA2 : AbstractProductA
    {
    }

    class ProductB2 : AbstractProductB
    {
        public override void Interact(AbstractProductA a)
        {
            Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
        }
    }

    class Clinet
    {
        private AbstractProductA abstractProductA;
        private AbstractProductB abstractProductB;
        public Clinet(AbstractFactory factory)
        {
            abstractProductA = factory.CreateProductA();
            abstractProductB = factory.CreateProductB();
        }

        public void Run()
        {
            abstractProductB.Interact(abstractProductA);
        }
    }

 

元哥的筆記