一 、 抽象工厂 (Abstract Factory ) 模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品
等级结构,功能相关联的产品组成的家族。如图:
图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级
结构,就可以唯一的确定这个产品。
引进抽象工厂模式
所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。如果用
图来描述的话,如下图:
二 、 Abstract Factory 模式的结构
图中描述的东西用产品族描述如下
抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关
的。
具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合
适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥
有的接口。
具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这
是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
三 、 程序举例 :
该程序演示了抽象工厂的结构,本身不具有任何实际价值。
[C#] 纯文本查看 复制代码 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1.AbstractFactory
{
/// <summary>
/// 抽象工厂
/// </summary>
abstract class AbstractFactory
{
// Methods
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
}
/// <summary>
/// 具体工厂1
/// </summary>
class ConcreteFactory1 : AbstractFactory
{
// Methods
public override AbstractProductA CreateProductA()
{
return new ProductA1();
}
public override AbstractProductB CreateProductB()
{
return new ProductB1();
}
}
/// <summary>
/// 具体工厂2
/// </summary>
class ConcreteFactory2 : AbstractFactory
{
// Methods
public override AbstractProductA CreateProductA()
{
return new ProductA2();
}
public override AbstractProductB CreateProductB()
{
return new ProductB2();
}
}
/// <summary>
/// 抽象产品A
/// </summary>
abstract class AbstractProductA
{
}
/// <summary>
/// 抽象产品B
/// </summary>
abstract class AbstractProductB
{
// Methods
public abstract void Interact(AbstractProductA a);
}
/// <summary>
/// 产品A1
/// </summary>
class ProductA1 : AbstractProductA
{
}
/// <summary>
/// 产品B1
/// </summary>
class ProductB1 : AbstractProductB
{
// Methods
public override void Interact(AbstractProductA a)
{
Console.WriteLine(this + " interacts with " + a);
}
}
/// <summary>
/// 产品A2
/// </summary>
class ProductA2 : AbstractProductA
{
}
/// <summary>
/// 产品B2
/// </summary>
class ProductB2 : AbstractProductB
{
// Methods
public override void Interact(AbstractProductA a)
{
Console.WriteLine(this + " interacts with " + a);
}
}
// "Client" - the interaction environment of the products
class Environment
{
// Fields
private readonly AbstractProductA AbstractProductA;
private readonly AbstractProductB AbstractProductB;
// Constructors
public Environment(AbstractFactory factory)
{
AbstractProductB = factory.CreateProductB();
AbstractProductA = factory.CreateProductA();
}
// Methods
public void Run()
{
AbstractProductB.Interact(AbstractProductA);
}
}
/// <summary>
/// ClientApp test environment
/// </summary>
class ClientApp
{
public void Start()
{
AbstractFactory factory1 = new ConcreteFactory1();
Environment e1 = new Environment(factory1);
e1.Run();
AbstractFactory factory2 = new ConcreteFactory2();
Environment e2 = new Environment(factory2);
e2.Run();
}
}
}
|