您的位置:首页 > 其它

设计模式解析(第二版)笔记6 Abstract Factory 抽象工厂模式

2008-12-11 13:23 471 查看
意图: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类.

UML:



代码:

// Abstract Factory pattern -- Structural example
using System;

namespace DoFactory.GangOfFour.Abstract.Structural

{

/// <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 ConcreteFactory1();

Client client1 = new Client(factory1);

client1.Run();

// Abstract factory #2

AbstractFactory factory2 = new ConcreteFactory2();

Client client2 = new Client(factory2);

client2.Run();

// Wait for user input

Console.ReadKey();

}

}

/// <summary>

/// The 'AbstractFactory' abstract class

/// </summary>

abstract class AbstractFactory

{

public abstract AbstractProductA CreateProductA();

public abstract AbstractProductB CreateProductB();

}

/// <summary>

/// The 'ConcreteFactory1' class

/// </summary>

class ConcreteFactory1 : AbstractFactory

{

public override AbstractProductA CreateProductA()

{

return new ProductA1();

}

public override AbstractProductB CreateProductB()

{

return new ProductB1();

}

}

/// <summary>

/// The 'ConcreteFactory2' class

/// </summary>

class ConcreteFactory2 : AbstractFactory

{

public override AbstractProductA CreateProductA()

{

return new ProductA2();

}

public override AbstractProductB CreateProductB()

{

return new ProductB2();

}

}

/// <summary>

/// The 'AbstractProductA' abstract class

/// </summary>

abstract class AbstractProductA

{

}

/// <summary>

/// The 'AbstractProductB' abstract class

/// </summary>

abstract class AbstractProductB

{

public abstract void Interact(AbstractProductA a);

}

/// <summary>

/// The 'ProductA1' class

/// </summary>

class ProductA1 : AbstractProductA

{

}

/// <summary>

/// The 'ProductB1' class

/// </summary>

class ProductB1 : AbstractProductB

{

public override void Interact(AbstractProductA a)

{

Console.WriteLine(this.GetType().Name +

" interacts with " + a.GetType().Name);

}

}

/// <summary>

/// The 'ProductA2' class

/// </summary>

class ProductA2 : AbstractProductA

{

}

/// <summary>

/// The 'ProductB2' class

/// </summary>

class ProductB2 : AbstractProductB

{

public override void Interact(AbstractProductA a)

{

Console.WriteLine(this.GetType().Name +

" interacts with " + a.GetType().Name);

}

}

/// <summary>

/// The 'Client' class. Interaction environment for the products.

/// </summary>

class Client

{

private AbstractProductA _abstractProductA;

private AbstractProductB _abstractProductB;

// Constructor

public Client(AbstractFactory factory)

{

_abstractProductB = factory.CreateProductB();

_abstractProductA = factory.CreateProductA();

}

public void Run()

{

_abstractProductB.Interact(_abstractProductA);

}

}

}

switch语句本身常常说明:(1)需要多态行为;(2)存在职责错放.

这个模式之所以称为抽象工厂,是因为它要创建的东西本身是由抽象定义的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: