动机:实现一系列相互依赖对象的创建,通过封装系列对象创建来隔离对象创建和客户程序,从而能够灵活提供更多系列对象创建和系列对象间的切换,而不需要改变客户程序。
应用:多种风格软件界面控件的创建、对应多种数据库的多系列数据访问层对象的创建(比如Petshop中的数据访问层对象)。
场景:此处以ThinkPad系列产品的组装为例子。组装电脑程序(即客户)需要根据需要拿出不同系列ThinkPad(此处以T43和T60为例)部件(以CPU和主板为例)组装成ThinkPad。因为T43和T60的CPU系列接口不同,所以同一系列中的CPU和主板相互依赖,每次只能拿同一系列的CPU和主板进行组装。
Factory Method模式:Factory Method模式是Abstract Factory模式的特殊形式,它实现一个对象的创建,而Abstract Factory模式实现系列对象创建。如这里只涉及到多种CPU的创建,则变为了Factory Method模式。
结构
代码实现
应用:多种风格软件界面控件的创建、对应多种数据库的多系列数据访问层对象的创建(比如Petshop中的数据访问层对象)。
场景:此处以ThinkPad系列产品的组装为例子。组装电脑程序(即客户)需要根据需要拿出不同系列ThinkPad(此处以T43和T60为例)部件(以CPU和主板为例)组装成ThinkPad。因为T43和T60的CPU系列接口不同,所以同一系列中的CPU和主板相互依赖,每次只能拿同一系列的CPU和主板进行组装。
Factory Method模式:Factory Method模式是Abstract Factory模式的特殊形式,它实现一个对象的创建,而Abstract Factory模式实现系列对象创建。如这里只涉及到多种CPU的创建,则变为了Factory Method模式。
结构
代码实现
/*
* 产品CPU
*/
namespace DesignPattern.AbstractFactory
{
public abstract class CPU
{
}
public class T43CPU : CPU
{
}
public class T60CPU : CPU
{
}
}
* 产品CPU
*/
namespace DesignPattern.AbstractFactory
{
public abstract class CPU
{
}
public class T43CPU : CPU
{
}
public class T60CPU : CPU
{
}
}
/*
* 产品主板
*/
namespace DesignPattern.AbstractFactory
{
public abstract class Mainboard
{
}
public class T43Mainboard : Mainboard
{
}
public class T60Mainboard : Mainboard
{
}
}
* 产品主板
*/
namespace DesignPattern.AbstractFactory
{
public abstract class Mainboard
{
}
public class T43Mainboard : Mainboard
{
}
public class T60Mainboard : Mainboard
{
}
}
/*
* 不同ThinkPad系列相互依赖部件组成不同型号ThinkPad,此处忽略各种不同型号。
*/
namespace DesignPattern.AbstractFactory
{
public class ThinkPad
{
public void Play()
{
}
}
}
* 不同ThinkPad系列相互依赖部件组成不同型号ThinkPad,此处忽略各种不同型号。
*/
namespace DesignPattern.AbstractFactory
{
public class ThinkPad
{
public void Play()
{
}
}
}
/*
* ThinkPad工厂,生产各型号ThinkPad部件
*/
namespace DesignPattern.AbstractFactory
{
public abstract class ThinkPadFactory
{
public abstract CPU CreateCPU();
public abstract Mainboard CreateMainboard();
}
public class T43Factory : ThinkPadFactory
{
public override CPU CreateCPU()
{
return new T43CPU();
}
public override Mainboard CreateMainboard()
{
return new T43Mainboard();
}
}
public class T60Factory : ThinkPadFactory
{
public override CPU CreateCPU()
{
return new T60CPU();
}
public override Mainboard CreateMainboard()
{
return new T60Mainboard();
}
}
}
* ThinkPad工厂,生产各型号ThinkPad部件
*/
namespace DesignPattern.AbstractFactory
{
public abstract class ThinkPadFactory
{
public abstract CPU CreateCPU();
public abstract Mainboard CreateMainboard();
}
public class T43Factory : ThinkPadFactory
{
public override CPU CreateCPU()
{
return new T43CPU();
}
public override Mainboard CreateMainboard()
{
return new T43Mainboard();
}
}
public class T60Factory : ThinkPadFactory
{
public override CPU CreateCPU()
{
return new T60CPU();
}
public override Mainboard CreateMainboard()
{
return new T60Mainboard();
}
}
}
/*
* 客户程序,从ThinkPad工厂中拿出所需系列部件进行组装。
*/
namespace DesignPattern.AbstractFactory
{
public class ThinkPadAssembly
{
public static readonly ThinkPadAssembly Instanse = new ThinkPadAssembly();
public ThinkPad CreateThinkPad(string strThinkPadName)
{
ThinkPadFactory thinkPadFactory = (ThinkPadFactory)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance("DesignPattern.AbstractFactory" + "." + strThinkPadName + "Factory");
CPU cpu = thinkPadFactory.CreateCPU();
Mainboard mainboard = thinkPadFactory.CreateMainboard();
return Assemble(cpu, mainboard);
}
private ThinkPad Assemble(CPU cpu, Mainboard mainboard)
{
// 组装并返回ThinkPad,此处简化各种型号的ThinkPad
return new ThinkPad();
}
}
}
* 客户程序,从ThinkPad工厂中拿出所需系列部件进行组装。
*/
namespace DesignPattern.AbstractFactory
{
public class ThinkPadAssembly
{
public static readonly ThinkPadAssembly Instanse = new ThinkPadAssembly();
public ThinkPad CreateThinkPad(string strThinkPadName)
{
ThinkPadFactory thinkPadFactory = (ThinkPadFactory)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance("DesignPattern.AbstractFactory" + "." + strThinkPadName + "Factory");
CPU cpu = thinkPadFactory.CreateCPU();
Mainboard mainboard = thinkPadFactory.CreateMainboard();
return Assemble(cpu, mainboard);
}
private ThinkPad Assemble(CPU cpu, Mainboard mainboard)
{
// 组装并返回ThinkPad,此处简化各种型号的ThinkPad
return new ThinkPad();
}
}
}
欢迎光临我的淘宝http://shop35795100.taobao.com,专营游戏点卡、电话卡及各类充值卡。