刚开始看设计模式,虽然代码看不懂但是里面的故事都很有趣呢。用活字印刷来讲面向对象形象而深刻,面向对象从学习VB开始就给我们引入了,直到学习了设计模式一段时间,才慢慢有一点懂了。拿机房收费系统来说,我们是通过一个一个功能实现的;有了面向对形象,我们就会把功能中的类抽象出来,来完成某个功能,使代码得到很好的复用,有更好的封装性,需求有变化时可以更少更清晰的改动代码。
工厂三姐妹是指:简单工厂模式(Simple factory pattern)、工厂方法模式(factory pattern)和抽象工厂模式(Abstract Factory pattern)
既然是姐妹,有共同之处,也有不同之处,先看看UML图吧:
工厂类中包含了必要的逻辑判断,根据客户的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
违反了开放-封闭的原则。举例来说如果我想增加一种"M^N"运算,我们要修改简单工厂类中的代码。
于是工厂方法就诞生了,工厂方法是开放-封闭原则的典范。想要增加一种运算方式,只需要增加两个类就可以了,增加M^N"运算,只要增加生产"M^N“的工厂类"和“M^N”运算类就可以了,不需要在别的类中改代码。
现实中工厂有很多,早上起床要擦脸,制作毛巾需要制作毛巾的工厂。我们使用笔记本电脑就有生产笔记本电脑的工厂。客户想要购买一批橘子,水果厂商就会让橘子部门生产橘子,客户想购买一批苹果,水果厂商就会让苹果部门生产苹果。工厂模式和现实中的例子是一样的,客户端想进行加法运算,就告诉加法工厂(也就数实例化加法工厂),然后加法工厂就会生产出加法进行运算。
工厂模式的意图:定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。工厂方法吧实现的工作推迟到子类中去实现。
那么什么时候适合建立工厂模式呢?
有一组类似的对象需要创建、在编码时不能预见需要创建那种类的实例、需要考虑扩展性的时候可以考虑用工厂方法。
看了抽象工厂,会觉察出和简单工厂没有什么区别,的确是这样的。抽象工厂是对工厂方法的一个变形。
提供一个创建一系列或相关依赖对象的接口,无需指定他们具体的类。抽象工厂在解决数据库更换方面是占优势的。抽象工厂可以解决多个类型产品的创建问题。
里面的类太多了,看一个又一个的接口(抽象出来的类),类太多,增加一个接口要改好多地方的代码很不方便。
工厂方法模型就没有抽象类那么臃肿了,身上没有挂那么多抽象接口类,创建时比较灵活。
一家公司,想要在重庆和北京两个地方分别建立一家分店,我们都知道四川那边比较爱吃辣,而北京这边中等口味即可。所以这两家店做出的口味是不同的。这两家店的菜单中的菜是一样的,就是口味不同。和例子中一样,数据库中都有用户名和密码等内容,就是表示方式不同。
总结:工厂三姐妹,抽象工厂和工厂方法都是符合开放-封闭原则的,简单工厂虽然没有符合开放-封闭原则,但是可以和抽象工厂相结合实现简化代码的作用。每一个模式可以用于不同的场景之中,各有所长。现在只是简单知道,这三种模式是什么,在以后的实践中再探索它们的精华所在吧。