抽象工厂模式
提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类。
抽象工厂模式的定义
抽象工厂模式的应用方式是:系统中先定义一组抽象类,而这些抽象类的子类,是更具不同的执行环境去产生的,所以:
- 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();
}
}