返回

20.抽象工厂模式

提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类。

抽象工厂模式

提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类。

抽象工厂模式的定义

抽象工厂模式的应用方式是:系统中先定义一组抽象类,而这些抽象类的子类,是更具不同的执行环境去产生的,所以:

  • ProductA1 和 ProductB1 是执行环境1时使用的
  • ProductA2 和 ProductB2 是执行环境2时使用的

现在,系统如果要能根据当前的执行环境,自动决定要产生哪一组子类时,抽象工厂模式(Abstract Factory)就可以排上用场。抽象工厂接口定义了产生不同类对象的方法,而继承的工厂子类,则是实现产生不同产品的类:

  • ConcreteFactory1 是给执行环境1时使用的,可以产生ProductA1和ProductB1
  • ConcreteFactory2 是给执行环境2时使用的,可以产生ProductA2和ProductB2

具体实现

    // 可生成各抽象成品物件的操作
    public abstract class AbstractFactory
    {
        public abstract AbstractProductA CreateProductA();
        public abstract AbstractProductB CreateProductB();
    }

    // 實作出可建構具象成品物件的操作1
    public class ConcreateFactory1 : AbstractFactory
    {
        public ConcreateFactory1()
        {
        }

        public override AbstractProductA CreateProductA()
        {
            return new ProductA1();
        }

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

    // 實作出可建構具象成品物件的操作2
    public class ConcreateFactory2 : AbstractFactory
    {
        public ConcreateFactory2()
        {
        }

        public override AbstractProductA CreateProductA()
        {
            return new ProductA2();
        }

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

    // 成品物件類型A界面
    public abstract class AbstractProductA
    {
    }

    // 成品物件類型A1
    public class ProductA1 : AbstractProductA
    {
        public ProductA1()
        {
            Debug.Log("生成物件類型A1");
        }
    }

    // 成品物件類型A2
    public class ProductA2 : AbstractProductA
    {
        public ProductA2()
        {
            Debug.Log("生成物件類型A2");
        }
    }

    // 成品物件類型B界面
    public abstract class AbstractProductB
    {
    }

    // 成品物件類型B1
    public class ProductB1 : AbstractProductB
    {
        public ProductB1()
        {
            Debug.Log("生成物件類型B1");
        }
    }

    // 成品物件類型B2
    public class ProductB2 : AbstractProductB
    {
        public ProductB2()
        {
            Debug.Log("生成物件類型B2");
        }
    }
public class AbstractFactoryTest
{
    // 測試抽象工廠
    void UnitTest()
    {
        AbstractFactory Factory = null;

        // 工廠1
        Factory = new ConcreateFactory1();
        // 產生兩個產品
        Factory.CreateProductA();
        Factory.CreateProductB();

        // 工廠2
        Factory = new ConcreateFactory2();
        // 產生兩個產品
        Factory.CreateProductA();
        Factory.CreateProductB();
    }
}