抽象工厂模式
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。抽象工厂模式和工厂模式的区别在于:工厂模式中的每一个产品都来自同一个产品结构(同一接口或抽象类),工厂模式一个工厂只生产一个产品;抽象工厂模式的每一个产品都来自不同的产品结构(不同的接口或抽象类),但它们都属于同一个产品族(位于不同产品等级结构中功能相关联的产品组成的家族),比如两个手机生产厂家都生产3G\4G手机,同一厂家的3G、4G手机同属于一个产品结构,都来自一个厂商。但是另一个划分是用3G\4G进行划分。3G手机来自两个厂家(这时3G手机就是一个产品族,对于4G手机也是一个产品族),抽象工厂模式 –> 一个工厂可以 生产 产品族当中的 一系列产品
具体实现:
1.定义产品接口(也可以时抽象类),每个接口提供了不同的产品规范,但存在有共性的东西;2.定义产品实现类,继承产品接口,实现产品规范,不同的产品定义不同的实现类;3.按产品族定义工厂接口(也可以是抽象类),该族中的每个产品类都有对应的实例化方法声明;4.定义实现工厂接口的实现类,完成产品的实例化工作。
以上内容来自《软件工程导论》
更具体的例子:
比如富士康要为小米公司和苹果公司生产手机.要生产的产品有小米公司的小米5、小米6,苹果公司的IPhone5、IPhone6。由于市场需求旺盛富士康准备在两个工厂:富士康(北京),富士康(上海)同时生产. 这时候就可以把小米的手机产品进行规范化处理定义接口IProductXiaomi,小米5抽象成ProductXiaomi5,小米6抽象成ProductXiaomi6.把苹果的手机产品进行规范化处理定义接口IProductIPhone,IPhone5抽象成ProductIPhone5,IPhone6抽象成ProductIPhone6.由于富士康(北京)属于富士康(华北),所以将富士康(华北)规范化处理为IFactoryNorth,而富士康(上海)属于富士康(华东),所以将富士康(华东)规范化处理为IFactoryEast而富士康(北京)就是FactoryBeijing,富士康(上海)就是FactoryShanghai.富士康(北京)负责生产小米5和IPhone5,而富士康(上海)负责生产小米6和IPhone6富士康总部生产手机时就可以用富士康(北京)FactoryBeijing去实例化富士康(华北)IFactoryNorth类型的实例factoryBeijing.接着让富士康(北京)factoryBeijing调用自身的生产产品的方法(例如:CreateProductXiaomi5())去实例化相应的产品..同理,富士康(上海)也一样.
C#语言实现
using System;
namespace AbstractFactoryPattern
{
#region 产品
public interface IProductA {
void ProductMethod();
}
public interface IProductB {
void ProductMethod();
}
public class ProductA1 : IProductA {
public void ProductMethod(){
Console.WriteLine(
"我是产品一中的A1型产品");
}
}
public class ProductA2 : IProductA {
public void ProductMethod() {
Console.WriteLine(
"我是产品一中的A2型产品");
}
}
public class ProductB1 : IProductB {
public void ProductMethod() {
Console.WriteLine(
"我是产品二中的B1型产品");
}
}
public class ProductB2 : IProductB {
public void ProductMethod() {
Console.WriteLine(
"我是产品二中的B2型产品");
}
}
#endregion
#region 工厂
public interface IFactoryA {
IProductA CreateProductA1();
IProductB CreateProductB1();
}
public interface IFactoryB {
IProductA CreateProductA2();
IProductB CreateProductB2();
}
public class FactoryA:IFactoryA {
public IProductA
CreateProductA1() {
return new ProductA1();
}
public IProductB
CreateProductB1() {
return new ProductB1();
}
}
public class FactoryB : IFactoryB {
public IProductA
CreateProductA2() {
return new ProductA2();
}
public IProductB
CreateProductB2() {
return new ProductB2();
}
}
#endregion
#region 使用者
class Program
{
static void Main(
string[] args)
{
IFactoryA factoryA =
new FactoryA();
IProductA productA1 = factoryA.CreateProductA1();
IProductB productB1 = factoryA.CreateProductB1();
productA1.ProductMethod();
productB1.ProductMethod();
IFactoryB factoryB =
new FactoryB();
IProductA productA2 = factoryB.CreateProductA2();
IProductB productB2 = factoryB.CreateProductB2();
productA2.ProductMethod();
productB2.ProductMethod();
}
}
#endregion
}