转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html

设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

  被腾讯笔试打击到了,腾讯笔试的设计模式题目都没有做对过,所以我要学习下设计模式,就买了入门的《大话设计模式》这本书。

  我从昨天下午开始看这本书,今天中午看完,发现这本书浅显易懂,作为入门读物还是不错的。

  好脑子不如烂笔头,我还是将所学的东西记载下来,供我以后来看吧。

  

  简单工厂模式

  

  当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product

  例如在大话设计模式P11给的运算工厂例子:

  

public static Operation createOperate(string operate)
{
Operation oper = null;
12
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
}
return oper;
}
}

  调用工厂,需要createOperator("/"),就能返回除法运算符。

  优点:客户端不需要修改代码。

  缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

  

  工厂方法模式

  UML类图如下:

  

  这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂

  好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。

  缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。

  抽象工厂模式:

  UML类图如下:

  

  从图上可以看出这和工厂方法模式很相似,但是呢,有几个区别:

  抽象工厂模式,一个具体工厂可以制造几个产品,例如微软工厂(相当于SqlserverFactory)可以制造微软鼠标(属于鼠标类,鼠标类下面有惠普鼠标,微软鼠标等,相当于上图中的IDepartment下面的SqlserverDepartment和AccessDepartment),也可以制造微软键盘(属于键盘类,键盘类下面有惠普键盘,微软键盘等,相当于上图中的IUser下面的SqlserverUser和AccessUser)。

  引用http://blog.csdn.net/wangwenhui11/article/details/3955125中的话:

  

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

  优点:易于交换产品系列,例如Access和SQLServer数据库之间切换。

  缺点:例如增加一个机箱产品,不仅需要添加三个类“机箱类,微软机箱,惠普机箱”,还要修改惠普工厂,微软工厂支持制造机箱。而添加一个联想工厂的时候,只需要添加三个类,使用联想工厂还是要修改客户端代码的。

  

  在《大话设计模式》中,提出用简单工厂模式改进抽象工厂模式的方法。

  

  DataAccess的代码如下:

  

   这样,在DataAccess里面直接指定数据库(指定品牌),当需要换数据库(or 品牌)的时候,修改DataAccess内的代码。

   当然可以用反射方法修改数据库,这样,只需要修改配置文件。就完美的改善了抽象工厂的缺点,而且在客户端不用修改代码。

  反射实现:

  

要修改db属性:

此文参考《大话设计模式》内容,转载请注明出处http://www.cnblogs.com/stonehat/

转载于:https://www.cnblogs.com/acSzz/p/5895378.html

设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...相关推荐

  1. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  2. 设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  3. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  4. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  5. 工厂模式(简单工厂、工厂方法、抽象工厂)

    简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决 ...

  6. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  7. Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)

    文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂) 一.简单工厂模式 引出简单工厂模式 二.工厂方法模式 三.抽象工厂模式 Android源码中用到的工厂模式举例 一.BitmapFactory ...

  8. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...

  9. 工厂模式(简单工厂,工厂方法,抽象工厂)

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

最新文章

  1. python GUI编程( 二 ) (基于PyQt5)
  2. Flask-Login一些使用解释(根据官网和个人查找资料的理解并解释)
  3. [老男孩笔记系列]-之linux定时任务crontab命令详解
  4. Spring学习总结二
  5. 协同过滤—基于图的方法
  6. C# Linq to Entity Lamda方式分组并求和求平均值
  7. Android 11 无法调起微信支付解决方案
  8. java第一句_Java如何开始第一个项目?
  9. 蓝鲸“配置平台”正式开源
  10. Android Studio and Gradle are using different locations for the JDK
  11. 两数相加—C语言逐位相加版(注释详尽)
  12. Ubuntu安装MDK5
  13. 复现贪吃蛇程序——判断游戏失败(第四部分)
  14. markdown pad2注册码(2017年9月27日)
  15. 摸鱼还要提醒?用Python整个倒计时界面自觉摸鱼~
  16. RandomAccessFile类的readLine方法对文本文件中文字符读取显示乱码的问题及解决方法的深入分析
  17. Python高效编程之88条军规(1):编码规范、字节序列与字符串
  18. dell服务器uefi启动不了系统安装系统安装,新版戴尔bios设置UEFI引导的方法
  19. Ajax请求导出Excel的问题【ajax不能下载文件】
  20. 郑州大学信息内容安全2021期末考试题

热门文章

  1. 4符号代码_ELF文件格式解析器 原理 + 代码
  2. android百度地图单点定位_Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡...
  3. Echarts鼠标悬浮样式
  4. 【NOIP2004】【Luogu1090】合并果子
  5. python内容目标_python抓取一个页面的目标网址,然后抓取目标网址里的内容
  6. 蚂蚁森林用户须知_公益传播视角下“蚂蚁森林”的用户使用行为研究
  7. python mainloop作用_Tkinter中的mainloop应该如何理解?
  8. 索引 2 超出范围。_重点推荐:音响灯光行业搜索引擎推广教学
  9. linux系统给串口权限,让ubuntu串口和USB设备不用root权限访问
  10. SonarQube遇到的启动问题及解决方案