工厂模式_动力节点Java学院整理

 更新时间:2017年08月07日 10:42:59   作者:stonehat  
这篇文章主要介绍了工厂模式_动力节点Java学院整理的相关资料,需要的朋友可以参考下

 简单工厂模式

  

  当需要加法类的时候,调用工厂类的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)。

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

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

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

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

  

  DataAccess的代码如下:

  

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

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

  反射实现:

  

要修改db属性:

相关文章

  • SpringBoot中到底该如何解决跨域问题

    SpringBoot中到底该如何解决跨域问题

    跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,这篇文章主要给大家介绍了关于SpringBoot中到底该如何解决跨域问题的相关资料,需要的朋友可以参考下
    2022-02-02
  • Springboot如何设置过滤器及重复读取request里的body

    Springboot如何设置过滤器及重复读取request里的body

    这篇文章主要介绍了Springboot如何设置过滤器及重复读取request里的body,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Springboot jdbctemplate整合实现步骤解析

    Springboot jdbctemplate整合实现步骤解析

    这篇文章主要介绍了Springboot jdbctemplate整合实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java读取http请求中的body实例代码

    java读取http请求中的body实例代码

    下面小编就为大家带来一篇java读取http请求中的body实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • MyBatis通过JDBC数据驱动生成的执行语句问题

    MyBatis通过JDBC数据驱动生成的执行语句问题

    这篇文章主要介绍了MyBatis通过JDBC数据驱动生成的执行语句问题的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • JAVA实现图书管理系统项目

    JAVA实现图书管理系统项目

    相信每一个学生学编程的时候,应该都会写一个小项目——图书管理系统。为什么这么说呢?我认为一个学校的氛围很大一部分可以从图书馆的氛围看出来,而图书管理系统这个不大不小的项目,接触的多,也比较熟悉,不会有陌生感,能够练手,又有些难度,所以我的小项目也来了
    2021-10-10
  • 作为Java程序员应该掌握的10项技能

    作为Java程序员应该掌握的10项技能

    这篇文章主要介绍了作为Java程序员应该掌握的10项技能,包括java的知识点与相关的技能,对于java的学习有不错的参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • 一篇文章带你了解Java SpringBoot Nacos

    一篇文章带你了解Java SpringBoot Nacos

    这篇文章主要介绍了SpringBoot使用Nacos配置中心的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-09-09
  • java 中设计模式(装饰设计模式)的实例详解

    java 中设计模式(装饰设计模式)的实例详解

    这篇文章主要介绍了java 中设计模式(装饰设计模式)的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • java读取资源路径的几种实现方式

    java读取资源路径的几种实现方式

    文章总结了Java读取资源路径的几种方式,并指出了在JUnit测试文件和普通类中读取资源路径的区别,普通类中读取资源路径时,只返回主目录,而JUnit测试文件中可以精确到所在模块
    2025-02-02

最新评论