简单工厂:将界面与业务逻辑分离,分离出一个类专门来创建实例的过程,是工厂模式家族中最简单实用的模式。
UML图:
简单工厂类代码展示:
//简单运算工厂,输入运算符号,工厂就实例化出合适的对象 public class OperationFactory { public static Operation createOperate(string operate) { Operation oper = null; switch (operate) { case "+": oper = new OperationAdd(); break; case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; case "/": oper = new OperationDiv(); break; } return oper; }缺点:违背开放封闭原则,为什么这么说呢?如果要增加一个新的运算功能,我们需要在工厂类中增加case分支条件,修改原来的类,这就等于说,我们对扩展开放了,对修改也开放了,所以简单工厂违背开放封闭原则。
//客户端代码 class Program { static void Main(string[] args) { try { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请选择运算符号(+,-,/,*):"); string strOperation = Console.ReadLine(); Console.Write("请输入数字B:"); string strNumberB = Console.ReadLine(); Operation oper; oper = OperationFactory.createOperate(strOperation); oper.NumberA = Convert.ToDouble(strNumberA); oper.NumberB = Convert.ToDouble(strNumberB); double strResult = oper.GetResult(); Console.WriteLine("结果是"+ strResult); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine("您的输入有误" + ex.Message); } Console.ReadKey(); } }优点:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
演变:由于简单工厂模式不仅对扩展开放,而且对修改也开放了,于是工厂方法就来了。
工厂方法: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实 例化延迟到其子类。
为了遵循扩展开放,修改关闭原则,将简单工厂类转换为工厂方法接口,将其Switch分支分离成子类去继 承工厂方法接口类,顺利的将创建对象的过程延迟到子类。
UML图:
优点:弥补了简单工厂的缺点,完美运用了开放封闭原则,这样就让子类去决定实例化具体的类了,分工更细了,责任到人。这时候,我们要添加幂运算只需在工厂类和运算类下分别扩展一下,而不用修改代码了,弥补了简单工厂模式的不足之处。并且很好的体现了依赖倒转原则
缺点:工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,增加功能时,本来是改工厂类的,而现在是修改客户端。且由于功能的增加,类就会增加,若是需要修改多个类的时候,维护工作量就会增加,所以,工厂方法模式虽然有利于扩展但是不利于维护。
演变:当需要生产一系列的产品时,比如说有两种级别的计算器,一种是我们常见的算术型计算器,一种是科学型计算器,它们都能计算加减乘除,而工厂方法模式实现的只是一种计算器。这个时候,就要用抽象工厂模式了。
抽象工厂: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。 工厂方法模式的转变,增加工厂方法接口的方法就重构出了抽象工厂。
工厂方法模式与抽象工厂模式的区别其实就是两句话:前者只有一个抽象产品类,而后者有多个。前者的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
UML图
一张图胜过千言万语,我们可以看出抽象工厂模式可以定义一系列即多个产品类和多个对象接口,分别派生出多个子类;而工厂方法模式只需要定义一个接口,然后派生出多个子类。
优点: 改变一个产品系列时,只需改变具体的工厂即可,没有其他的变动,与具体产品无关。遵循了开放——封闭原与依赖倒转原则。
缺点: 如果增加一个功能,就要增加相应的类,接口,还要改变Ifactory工厂,SqlserverFactory以及AccessFactory三个工厂类。违背了“开闭原则”。
工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构。另外抽象工厂模式在增加新功能时,违背开闭原则,可以将抽象工厂模式与简单工厂模式以及反射技术结合使用,反射的技术可以克服抽象工厂模式的不足,但是理解尚浅,还需不断努力、