1.定义
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
二、抽象工厂模式结构
1.模式结构
抽象工厂模式包含如下角色:
AbstractFactory:抽象工厂
ConcreteFactory:具体工厂
AbstractProduct:抽象产品
Product:具体产品
三、抽象工厂的使用实例
假设有一个移动终端工厂,可以制造苹果系列的移动产品和三星系列的移动产品。这个工厂下有两个子厂,一个负责制造苹果系列的Pad和三星系列的Pad,另一个负责制造苹果系列的手机和三星系列的手机。这便是一个典型的抽象工厂的实例。
抽象产品: 苹果系列
public interface Apple
{
void AppleStyle();
}
抽象产品: 三星系列
public interface Sumsung
{
void BangziStyle();
}
具体产品:iphone
public class iphone implements Apple
{
public void AppleStyle()
{
Console.WriteLine(“Apple’s style: iPhone!”);
}
}
具体产品:ipad
public class ipad implements Apple
{
public void AppleStyle()
{
Console.WriteLine(“Apple’s style: iPad!”);
}
}
具体产品:note2
public class note2 implements Sumsung
{
public void BangziStyle()
{
Console.WriteLine(“Bangzi’s style : Note2!”);
}
}
具体产品:tabs
public class Tabs implements Sumsung
{
public void BangziStyle()
{
Console.WriteLine(“Bangzi’s style : Tab!”);
}
}
抽象工厂
public interface Factory
{
Apple createAppleProduct();
Sumsung createSumsungProduct();
}
手机工厂
public class Factory_Phone implements Factory
{
public Apple createAppleProduct()
{
return new iphone();
}
public Sumsung createSumsungProduct()
{
return new note2();
}
}
pad工厂
public class Factory_Pad implements Factory
{
public Apple createAppleProduct()
{
return new ipad();
}
public Sumsung createSumsungProduct()
{
return new Tabs();
}
}
客户端调用
public static void Main(string[] args)
{
//采购商要一台iPad和一台Tab
Factory factory = new Factory_Pad();
Apple apple = factory.createAppleProduct();
apple.AppleStyle();
Sumsung sumsung = factory.createSumsungProduct();
sumsung.BangziStyle();
//采购商又要一台iPhone和一台Note2
factory = new Factory_Phone();
apple = factory.createAppleProduct();
apple.AppleStyle();
sumsung = factory.createSumsungProduct();
sumsung.BangziStyle();
Console.ReadKey();
}
抽象工厂可以通过多态,来动态设置不同的工厂,生产不同的产品,同时每个工厂中的产品又不属于同一个产品等级结构。
用环境
在以下情况下可以使用抽象工厂模式:
①一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
②系统中有多于一个的产品族,而每次只使用其中某一产品族。与工厂方法模式的区别
③属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
④系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。