设计模式-工厂三姐妹
2015-12-16 16:17
183 查看
刚开始看设计模式,虽然代码看不懂但是里面的故事都很有趣呢。用活字印刷来讲面向对象形象而深刻,面向对象从学习VB开始就给我们引入了,直到学习了设计模式一段时间,才慢慢有一点懂了。拿机房收费系统来说,我们是通过一个一个功能实现的;有了面向对形象,我们就会把功能中的类抽象出来,来完成某个功能,使代码得到很好的复用,有更好的封装性,需求有变化时可以更少更清晰的改动代码。
工厂三姐妹是指:简单工厂模式(Simple factory pattern)、工厂方法模式(factory pattern)和抽象工厂模式(Abstract Factory pattern)
既然是姐妹,有共同之处,也有不同之处,先看看UML图吧:
于是工厂方法就诞生了,工厂方法是开放-封闭原则的典范。想要增加一种运算方式,只需要增加两个类就可以了,增加M^N"运算,只要增加生产"M^N“的工厂类"和“M^N”运算类就可以了,不需要在别的类中改代码。
工厂模式的意图:定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。工厂方法吧实现的工作推迟到子类中去实现。
那么什么时候适合建立工厂模式呢?
有一组类似的对象需要创建、在编码时不能预见需要创建那种类的实例、需要考虑扩展性的时候可以考虑用工厂方法。
工厂方法模型就没有抽象类那么臃肿了,身上没有挂那么多抽象接口类,创建时比较灵活。
总结:工厂三姐妹,抽象工厂和工厂方法都是符合开放-封闭原则的,简单工厂虽然没有符合开放-封闭原则,但是可以和抽象工厂相结合实现简化代码的作用。每一个模式可以用于不同的场景之中,各有所长。现在只是简单知道,这三种模式是什么,在以后的实践中再探索它们的精华所在吧。
工厂三姐妹是指:简单工厂模式(Simple factory pattern)、工厂方法模式(factory pattern)和抽象工厂模式(Abstract Factory pattern)
既然是姐妹,有共同之处,也有不同之处,先看看UML图吧:
简单工厂VS工厂方法
简单工厂优点:
工厂类中包含了必要的逻辑判断,根据客户的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。简单工厂不足:
违反了开放-封闭的原则。举例来说如果我想增加一种"M^N"运算,我们要修改简单工厂类中的代码。于是工厂方法就诞生了,工厂方法是开放-封闭原则的典范。想要增加一种运算方式,只需要增加两个类就可以了,增加M^N"运算,只要增加生产"M^N“的工厂类"和“M^N”运算类就可以了,不需要在别的类中改代码。
对于工厂模式的现实场景:
现实中工厂有很多,早上起床要擦脸,***毛巾需要***毛巾的工厂。我们使用笔记本电脑就有生产笔记本电脑的工厂。客户想要购买一批橘子,水果厂商就会让橘子部门生产橘子,客户想购买一批苹果,水果厂商就会让苹果部门生产苹果。工厂模式和现实中的例子是一样的,客户端想进行加法运算,就告诉加法工厂(也就数实例化加法工厂),然后加法工厂就会生产出加法进行运算。工厂模式的意图:定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。工厂方法吧实现的工作推迟到子类中去实现。
那么什么时候适合建立工厂模式呢?
有一组类似的对象需要创建、在编码时不能预见需要创建那种类的实例、需要考虑扩展性的时候可以考虑用工厂方法。
工厂方法VS抽象工厂
看了抽象工厂,会觉察出和简单工厂没有什么区别,的确是这样的。抽象工厂是对工厂方法的一个变形。抽象工厂的优点:
提供一个创建一系列或相关依赖对象的接口,无需指定他们具体的类。抽象工厂在解决数据库更换方面是占优势的。抽象工厂可以解决多个类型产品的创建问题。缺点:
里面的类太多了,看一个又一个的接口(抽象出来的类),类太多,增加一个接口要改好多地方的代码很不方便。工厂方法模型就没有抽象类那么臃肿了,身上没有挂那么多抽象接口类,创建时比较灵活。
生活场景再现:
一家公司,想要在重庆和北京两个地方分别建立一家分店,我们都知道四川那边比较爱吃辣,而北京这边中等口味即可。所以这两家店做出的口味是不同的。这两家店的菜单中的菜是一样的,就是口味不同。和例子中一样,数据库中都有用户名和密码等内容,就是表示方式不同。总结:工厂三姐妹,抽象工厂和工厂方法都是符合开放-封闭原则的,简单工厂虽然没有符合开放-封闭原则,但是可以和抽象工厂相结合实现简化代码的作用。每一个模式可以用于不同的场景之中,各有所长。现在只是简单知道,这三种模式是什么,在以后的实践中再探索它们的精华所在吧。
相关文章推荐
- 数据库db link
- centos7使用vnc viewer连接kvm虚拟机连接不上的解决方法
- easyui datagrid 去掉外边框及行与行之间的横线标题字体
- 常用iOS第三方库以及XCode插件介绍
- vi编辑器命令
- VS 正则表达式替换内容
- List<HashMap<String,String>> list, 根据hashmap中的某个键的值排序
- java图形界面设计1(AWT)
- 官网 webrtc_android 源码下载和编译
- Java多线程:volatile变量、happens-before关系及内存一致性
- MTK Android user版本如何打开root权限
- 【jQuery】环境搭建
- Google Chrome插件开发-Context Menus
- 改变gridview选中项背景色
- const类型参数的对象引用和const成员函数
- 1、在Windows 上安装Rabbit MQ 指南
- Android Studio快速集成讯飞SDK实现文字朗读功能
- 有限自动机的构造和识别
- css基础浏览器的布局
- F2812 烧录Flash 锁死的解决方法