简单工厂模式的核心,就是用一个单独的类,来完成创造实例的过程。
例如,现在有一个CPU的工厂,它们目前生产3款CPU,型号分别为:8086,880,8085,具体生产那种型号的CPU,要看顾客怎么下单,如果顾客要求生产8086型号的CPU,那么,工厂接到单子后,就马上生产处一批8086的CPU,在这个过程中,顾客根本不用知道这款CPU是怎么生产的,它只要提供一个型号,然后就拿到指定型号的CPU。
整个工程用简单工厂模式描述,就是:
其中,CPU类,代表所有CPU的父类,它有各种参数,但是为了简化模型,这里只给出了一个参数。Client类承担简单工程中那个最核心的类,由这个类来判断,到底是实例化哪个对象。代码如下:
namespace myFactory { public class Cpu8086:CPU { public Cpu8086() { this.size="8086"; Console.WriteLine("生产的是8086CPU。"); } } public class Cpu8080:CPU { public Cpu8080() { this.size ="8080"; Console.WriteLine("生产的是8080CPU。"); } } public class Cpu8085:CPU { public Cpu8085() { this.size ="8085"; Console.WriteLine("生产的是8085CPU。"); } } public class Client { public static CPU chooseCPU(string Size) { CPU myCPU=null; switch(Size) { case "8086": myCPU =new Cpu8086(); break; case "8080": myCPU =new Cpu8080(); break ; case "8085": myCPU =new Cpu8085(); break ; } return myCPU; } } public class CPU { private string Size; public string size { get { return Size; } set { Size = value; } } } class Program { static void Main(string[] args) { CPU myCPU; myCPU =Client.chooseCPU("8086"); } } }
如上,如果客户选择生产8086型号的CPU,那么,只需给出一个型号,然后拿到产品。
简单工厂模式中有3中角色:
1,工厂角色:简单工厂模式的核心,负责创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建需 的产品对象。例如,上面的Client就是工厂角色,由它来觉得创建哪个实例。
2, 抽象产品角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。例如,CPU这个抽象类就是抽象产品的角色,所有的具体产品都继承于它。
3, 具体产品角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。例如,各种具体型号的CPU,如Cpu8086,这些都是具体产品角色,在模型中,这些是最终要得到的东西。
优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自 的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
最近学习设计模式,感觉编码要面向对象,学习则要面向生活。
注:文中部分内容来自百度。