抽象工厂模式
来源:互联网 发布:black知乎 编辑:程序博客网 时间:2024/06/03 09:35
1. 定义
抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2. UML 类图
3. 结构代码
该结构代码演示了创建并行对象层次结构的抽象工厂模式。对象创建是抽象的,也不需要硬编码的类名称在客户机代码中。
// Abstract Factory pattern -- Structural example
using System;
namespace DoFactory.GangOfFour.Abstract.Structural
{
///<summary>
/// MainApp startup class for Structural
/// Abstract Factory Design Pattern.
///</summary>
classMainApp
{
///<summary>
/// Entry point into console application.
///</summary>
publicstaticvoid Main()
{
// Abstract factory #1
AbstractFactory factory1 =newConcreteFactory1();
Client client1 =newClient(factory1);
client1.Run();
// Abstract factory #2
AbstractFactory factory2 =newConcreteFactory2();
Client client2 =newClient(factory2);
client2.Run();
// Wait for user input
Console.ReadKey();
}
}
///<summary>
/// The 'AbstractFactory' abstract class
///</summary>
abstractclassAbstractFactory
{
publicabstractAbstractProductA CreateProductA();
publicabstractAbstractProductB CreateProductB();
}
///<summary>
/// The 'ConcreteFactory1' class
///</summary>
classConcreteFactory1 :AbstractFactory
{
publicoverrideAbstractProductA CreateProductA()
{
returnnewProductA1();
}
publicoverrideAbstractProductB CreateProductB()
{
returnnewProductB1();
}
}
///<summary>
/// The 'ConcreteFactory2' class
///</summary>
classConcreteFactory2 :AbstractFactory
{
publicoverrideAbstractProductA CreateProductA()
{
returnnewProductA2();
}
publicoverrideAbstractProductB CreateProductB()
{
returnnewProductB2();
}
}
///<summary>
/// The 'AbstractProductA' abstract class
///</summary>
abstractclassAbstractProductA
{
}
///<summary>
/// The 'AbstractProductB' abstract class
///</summary>
abstractclassAbstractProductB
{
publicabstractvoid Interact(AbstractProductA a);
}
///<summary>
/// The 'ProductA1' class
///</summary>
classProductA1 :AbstractProductA
{
}
///<summary>
/// The 'ProductB1' class
///</summary>
classProductB1 :AbstractProductB
{
publicoverridevoid Interact(AbstractProductA a)
{
Console.WriteLine(this.GetType().Name +
" interacts with " + a.GetType().Name);
}
}
///<summary>
/// The 'ProductA2' class
///</summary>
classProductA2 :AbstractProductA
{
}
///<summary>
/// The 'ProductB2' class
///</summary>
classProductB2 :AbstractProductB
{
publicoverridevoid Interact(AbstractProductA a)
{
Console.WriteLine(this.GetType().Name +
" interacts with " + a.GetType().Name);
}
}
///<summary>
/// The 'Client' class. Interaction environment for the products.
///</summary>
classClient
{
privateAbstractProductA _abstractProductA;
privateAbstractProductB _abstractProductB;
// Constructor
public Client(AbstractFactory factory)
{
_abstractProductB = factory.CreateProductB();
_abstractProductA = factory.CreateProductA();
}
publicvoid Run()
{
_abstractProductB.Interact(_abstractProductA);
}
}
}
Output
ProductB1 interacts with ProductA1
ProductB2 interacts with ProductA2
4. 实例代码
该实例代码演示了在电脑游戏中使用不同的工厂来创建不同的动物世界
// Abstract Factory pattern -- Real World example
using System;
namespace DoFactory.GangOfFour.Abstract.RealWorld
{
///<summary>
/// MainApp startup class for Real-World
/// Abstract Factory Design Pattern.
///</summary>
classMainApp
{
///<summary>
/// Entry point into console application.
///</summary>
publicstaticvoid Main()
{
// Create and run the African animal world
ContinentFactory africa =newAfricaFactory();
AnimalWorld world =newAnimalWorld(africa);
world.RunFoodChain();
// Create and run the American animal world
ContinentFactory america =newAmericaFactory();
world = new AnimalWorld(america);
world.RunFoodChain();
// Wait for user input
Console.ReadKey();
}
}
///<summary>
/// The 'AbstractFactory' abstract class
///</summary>
abstractclassContinentFactory
{
publicabstractHerbivore CreateHerbivore();
publicabstractCarnivore CreateCarnivore();
}
///<summary>
/// The 'ConcreteFactory1' class
///</summary>
classAfricaFactory :ContinentFactory
{
publicoverrideHerbivore CreateHerbivore()
{
returnnewWildebeest();
}
publicoverrideCarnivore CreateCarnivore()
{
returnnewLion();
}
}
///<summary>
/// The 'ConcreteFactory2' class
///</summary>
classAmericaFactory :ContinentFactory
{
publicoverrideHerbivore CreateHerbivore()
{
returnnewBison();
}
publicoverrideCarnivore CreateCarnivore()
{
returnnewWolf();
}
}
///<summary>
/// The 'AbstractProductA' abstract class
///</summary>
abstractclassHerbivore
{
}
///<summary>
/// The 'AbstractProductB' abstract class
///</summary>
abstractclassCarnivore
{
publicabstractvoid Eat(Herbivore h);
}
///<summary>
/// The 'ProductA1' class
///</summary>
classWildebeest :Herbivore
{
}
///<summary>
/// The 'ProductB1' class
///</summary>
classLion :Carnivore
{
publicoverridevoid Eat(Herbivore h)
{
// Eat Wildebeest
Console.WriteLine(this.GetType().Name +
" eats " + h.GetType().Name);
}
}
///<summary>
/// The 'ProductA2' class
///</summary>
classBison :Herbivore
{
}
///<summary>
/// The 'ProductB2' class
///</summary>
classWolf :Carnivore
{
publicoverridevoid Eat(Herbivore h)
{
// Eat Bison
Console.WriteLine(this.GetType().Name +
" eats " + h.GetType().Name);
}
}
///<summary>
/// The 'Client' class
///</summary>
classAnimalWorld
{
privateHerbivore _herbivore;
privateCarnivore _carnivore;
// Constructor
public AnimalWorld(ContinentFactory factory)
{
_carnivore = factory.CreateCarnivore();
_herbivore = factory.CreateHerbivore();
}
publicvoid RunFoodChain()
{
_carnivore.Eat(_herbivore);
}
}
}
Output
Lion eats Wildebeest
Wolf eats Bison
- 工厂模式 -- 抽象工厂
- 工厂模式-抽象工厂
- 工厂模式-抽象工厂
- 工厂模式/抽象工厂模式
- 工厂模式&&抽象工厂模式
- 工厂模式---抽象工厂模式
- 工厂模式&抽象工厂模式
- 工厂模式,抽象工厂模式
- 【模式】抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 工厂方法,抽象工厂模式
- 2,工厂模式--抽象工厂
- C#工厂模式-抽象工厂
- 工厂模式与抽象工厂
- 抽象工厂设计模式
- 抽象工厂模式
- lucene使用教程4 --常用类的对象之IndexSearcher
- js实现单选框的选择
- 解决VS2008 无法解析的外部符号 "int __cdecl _AfxInitManaged(void)“,以及无法打开预编译头Debug\XXX.pch
- 怎么保证SD卡中的数据与物理SD卡绑定 防止SD卡中数据被复制到电脑上
- 通达OA提速 检查表索引,删除重复索引,并建立必要的新索引
- 抽象工厂模式
- 理解SVG的图形填充规则
- ASIHTTPRequest iphone下post和get数据的经典类库 配置
- modprobe的参数
- Android高手进阶教程(四)之----Android 中自定义属性(attr.xml,TypedArray)的使用!
- linux安装hadoop 1.0.3
- commons-beanutils-1.8.3 动态设置属性
- ASIHTTPRequest 详解 例子
- pseudo-streaming与真正的流媒体技术的区别