意图/定义:需要为特定的客户提供对象组
问题:需要实例化一组相关的对象
解决方案:协调对象组的创建。撮合 种方法,将如何执行对象实例化的规则从使用这些对象的客户对象中提取出来
参与者与协作者:AbstractFactory为如何创建对象组的每个成员定义接口。通常每个组都独立的ConcreteFactory来创建
效果:这个模式将"使用哪些对象的规则"与"如何使用这些对象"的逻辑分离开来
实现:定义一个抽象类来指定创建哪些对象。然后为每个组实现一个具体类。可以用表或文件完成同样的任务。
示例代码:我们继续上次工厂方法中举的肯德基和麦当劳的例子,客户去快餐店,并不只吃一种,可能吃多种如薯片、汉堡、炸鸡等,客户去到不同的快餐店就能吃到此快餐店所生产的所有食物。
using System;
namespace AbstractFactory
{
/// <summary>
/// MainApp startup class for Structural
/// Abstract Factory Design Pattern.
/// </summary>
class MainApp
{
/// <summary>
/// Entry point into console application.
/// </summary>
public static void Main()
{
// Abstract factory #1
AbstractFactory factory1 = new KFC_Factory();
Client client1 = new Client(factory1);
client1.Run();
// Abstract factory #2
AbstractFactory factory2 = new MD_Factory();
Client client2 = new Client(factory2);
client2.Run();
// Wait for user input
Console.ReadKey();
}
}
/// <summary>
/// The 'AbstractFactory' abstract class
/// </summary>
abstract class AbstractFactory
{
public abstract Chips CreateProductChips();
public abstract Hamburg CreateProductHamburg();
public abstract Cola CreateProductCola();
}
/// <summary>
/// The 'ConcreteFactory1' class
/// </summary>
class KFC_Factory : AbstractFactory
{
public override Chips CreateProductChips()
{
return new KFC_Chips();
}
public override Hamburg CreateProductHamburg()
{
return new KFC_Hamburg();
}
public override Cola CreateProductCola()
{
return new CocaCola();
}
}
/// <summary>
/// The 'ConcreteFactory2' class
/// </summary>
class MD_Factory : AbstractFactory
{
public override Chips CreateProductChips()
{
return new MD_Chips();
}
public override Hamburg CreateProductHamburg()
{
return new MD_Hamburg();
}
public override Cola CreateProductCola()
{
return new PepsiCola();
}
}
/// <summary>
/// The 'AbstractProductA' abstract class
/// </summary>
abstract class Chips
{
}
/// <summary>
/// The 'AbstractProductB' abstract class
/// </summary>
abstract class Hamburg
{
public abstract void Interact(Chips a,Cola b);
}
/// <summary>
/// The 'AbstractProductC' abstract class
/// </summary>
abstract class Cola
{
}
/// <summary>
/// The 'ProductA1' class
/// </summary>
class KFC_Chips : Chips
{
}
/// <summary>
/// The 'ProductB1' class
/// </summary>
class KFC_Hamburg : Hamburg
{
public override void Interact(Chips a, Cola b)
{
Console.WriteLine(this.GetType().Name +
" interacts with " + a.GetType().Name + " and " + b.GetType().Name);
}
}
/// <summary>
/// The 'ProductC1' class
/// </summary>
class CocaCola : Cola
{
}
/// <summary>
/// The 'ProductA2' class
/// </summary>
class MD_Chips : Chips
{
}
/// <summary>
/// The 'ProductB2' class
/// </summary>
class MD_Hamburg : Hamburg
{
public override void Interact(Chips a,Cola b)
{
Console.WriteLine(this.GetType().Name +
" interacts with " + a.GetType().Name + " and "+b.GetType().Name);
}
}
/// <summary>
/// The 'ProductC2' class
/// </summary>
class PepsiCola : Cola
{
}
/// <summary>
/// The 'Client' class. Interaction environment for the products.
/// </summary>
class Client
{
private Chips _chips;
private Hamburg _hamberg;
private Cola _cola;
// Constructor
public Client(AbstractFactory factory)
{
_chips = factory.CreateProductChips();
_hamberg = factory.CreateProductHamburg();
_cola = factory.CreateProductCola();
}
public void Run()
{
_hamberg.Interact(_chips, _cola);
}
}
}