动机:实现一系列相互依赖对象的创建,通过封装系列对象创建来隔离对象创建和客户程序,从而能够灵活提供更多系列对象创建和系列对象间的切换,而不需要改变客户程序。应用:多种风格软件界面控件的创建、对应多种数据库的多系列数据访问层对象的创建(比如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 { }}/**/ /** 产品主板*/ 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 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(); } }} 相关资源:敏捷开发V1.0.pptx
