工厂模式(实现创建者和调用者的分离,实现解耦)

  本质:实例化对象,用工厂方法代替new()操作;

     将选择实现类、创建对象统一管理和控制;从而实现将调用者和实现类解耦;

  分类:

     简单工厂:用来生产统一等级结构中的任何产品(对于增加新的产品,需要修改已有的代码)

     工厂方法:用来生产同一等级中的固定产品(对于增加新的产品,不需要修改已有的代码)

     抽象工厂模式:用来生产不同产品族的全部产品(对于增加新的产品无能为力,但是支持增加产品族)

  记得之前参与过的一个产品,根据不同的公司的需求,我们需要通过修改配置文件,从而连接到不同的数据库,支持DB2,mysql,Orical,那个实现就是用简单工厂来实现。现在简单来模拟一下:

 简单工厂:

  简单工厂的缺点在于:如果我需要添加支持DB2的数据库,需要修改原有的代码!

/*** <p>* Database 实体接口* <p>*/
public interface Database {void getDatabase();
}

/*** <p>* MysqlDB Mysql数据库连接实体* <p>*/
public class MysqlDB implements Database{@Overridepublic void getDatabase() {System.out.println("连接到mysql数据库");}
}

/*** <p>* OricalDB Orical数据库连接实体* <p>*/
public class OricalDB implements Database {@Overridepublic void getDatabase() {System.out.println("连接到orical数据库");}
}

/*** <p>* DBFactory 数据库连接工厂类* <p>*/
public class DBFactory {/*** 创建mysql连接实体* @return*/public static Database connectionMysql(){return new MysqlDB();}/*** 创建orical连接实体* @return*/public static Database connectionOrical(){return new OricalDB();}
}

/*** <p>* Client 测试类* <p>*/
public class Client {public static void main(String[] args) {Database orical = DBFactory.connectionOrical();Database mysql = DBFactory.connectionMysql();orical.getDatabase();mysql.getDatabase();}
}

 工厂方法 

   工厂方法模式和简单工厂模式最大的区别在于,简单工厂只有一个工厂类,但是工厂方法模式有一组实现了相同接口的工厂类,从而保证添加新产品,只需要通过增加新类即可,不需要修改原有代码!现在我们用工厂方法模式实现上面的需求:

  首先添加如上三个类:Database、MysqlDB、OricalDB。再添加如下类:

/*** <p>* DBFactory 工厂类接口* <p>*/
public interface DBFactory {Database connectionDB();
}

/*** <p>* MysqlDBFactory mysql工厂类接口类现类* <p>*/
public class MysqlDBFactory implements DBFactory {@Overridepublic Database connectionDB() {return new MysqlDB();}
}

/*** <p>* OricalDBFactory Orical工厂类接口类现类* <p>*/
public class OricalDBFactory implements DBFactory{@Overridepublic Database connectionDB() {return new OricalDB();}
}

/*** <p>* Client 工厂方法 实现工厂模式测试类* <p>*/
public class Client {public static void main(String[] args) {Database orical = new OricalDBFactory().connectionDB();Database mysql = new MysqlDBFactory().connectionDB();orical.getDatabase();mysql.getDatabase();}
}

 抽象工厂模式

  抽象工厂模式是工厂方法的升级版本,在多个业务品种、业务分类(即不同产品族)时,通过抽象工厂模式生产需要的对象是一种非常好的解决办法。

  所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。比如:汽车有高档、低档之分,具体来说是高档车配备了高端的引擎、高端轮胎...,而低档车配备了低端的引擎、低端的轮胎;那么轮胎、引擎就是两个产品族。

  工厂类生产出高档车就应该配备高端引擎和轮胎;低档车就应该配备低端的引擎和轮胎。下面我们来试试这个例子:

  

/*** Engine 引擎接口*/
public interface Engine {void run();
}
/*** 高端引擎*/
class HighEngine implements Engine{@Overridepublic void run() {System.out.println("高端发动机,跑的就是快...");}
}
/*** 低端引擎*/
class LowEngine implements Engine{@Overridepublic void run() {System.out.println("低端发动机,跑的好慢...");}
}

/*** 轮胎类接口 */
public interface Tyre {void skidproof();
}
/*** 高端轮胎*/
class HighTyre implements Tyre{@Overridepublic void skidproof() {System.out.println("高端轮胎就是防滑的...");}
}
/*** 低端轮胎*/
class LowTyre implements Tyre{@Overridepublic void skidproof() {System.out.println("低端轮胎是不防滑的...");}
}

/*** 汽车工厂接口*/
public interface CarFactory {//创建引擎
    Engine creatEnginer();//创建轮胎
    Tyre createTyre();
}
/*** 高端汽车工厂*/
class HighCarFactory implements CarFactory{@Overridepublic Engine creatEnginer() {return new HighEngine();}@Overridepublic Tyre createTyre() {return new HighTyre();}
}
/*** 低端汽车工厂*/
class LowCarFactory implements CarFactory{@Overridepublic Engine creatEnginer() {return new LowEngine();}@Overridepublic Tyre createTyre() {return new LowTyre();}
}

/*** 抽象工厂测试类*/
public class Client {public static void main(String[] args) {CarFactory highCarFactory = new HighCarFactory();Engine engine = highCarFactory.creatEnginer();Tyre tyre = highCarFactory.createTyre();engine.run();tyre.skidproof();}
}

  

设计模式之工厂模式和抽象工厂模式相关推荐

  1. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  2. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  3. 021 设计模式之工厂方法模式,抽象工厂模式的区别

    简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...

  4. 设计模式之工厂模式和抽象工厂

    设计模式分类 通常来说设计模式分为三大类: 创建型模式,共 5 种:工厂模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共 7 种:适配器模式.装饰器模式.代理模式.外观模式.桥接模 ...

  5. 设计模式你怎么看?--抽象工厂模式

    一  前言 在设计模式中有简单工厂,工厂方法,抽象工厂,这三种工厂方法,各自有各自的特点,但有都有共同的特点 工厂(Factory)都是围绕着工厂类转,这篇只写 "抽象工厂"相关的 ...

  6. [设计模式篇]工厂模式和抽象工厂模式

    最近在看Head First的Design Pattern,想想去年候捷来学校给我们讲Design Pattern,但当时水平太弱根本听不懂,今年想趁机再好好学一波,候捷反而不来了,哎,人生就是这样, ...

  7. 回顾游戏中的设计模式:策略模式vs抽象工厂

    最近有时间看看设计模式方面的书,好多东西时间久了不看就变得生疏起来, 在这里会抽出时间把自己在工作中使用过的设计模式做下总结. 刚才在看到别人说,简单工厂模式是"通过提供单独的一个类,来实现 ...

  8. 设计模式_1_工厂模式与抽象工厂

    工厂模式 工厂模式(创建型模式):创建对象接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建延伸到子类进行 主要解决接口选择问题,明确计划不同条件下执行创建不同实例 通过子类实现工厂实例,创建 ...

  9. 设计模式之(四)抽象工厂模式(Abstract Factory)

    工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...

  10. Java设计模式之工厂方法模式与抽象工厂模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.前期回顾 上一篇<Java设计模式之单例模式>详细介绍了单例模式,介绍了单例模式的使用场景,优缺点,同时也写了 ...

最新文章

  1. 阿里巴巴电商平台架构演变之路
  2. R语言使用read.delim函数读取带分隔符的文本文件
  3. SpringCloud服务消费者第一次调用出现超时问题的解决方案
  4. 关于共享单车,说点什么
  5. reactjs组件实例的三大属性之props使用示例:在函数式组件中使用props
  6. spark sql中的窗口函数
  7. c++ 暂停功能_2020.10.16撸友简报:NC资本澄清;去嗨皮打赏交易
  8. linux虚拟机cpu高耗gc,Tomcat服务器-并发压力测试下调优注意点小结 JVM client模式和Server模式的区别 jvm 参数优化---笔记 tomcat查看GC信息...
  9. 洛谷 P1086 花生采摘
  10. shell脚本中定义路径变量出现的BUG
  11. MyEclipse 保护色设置
  12. 网络编程+并发编程总结
  13. 01单片机——基础知识
  14. [Excel] 数据透视图
  15. 跑深度模型的显卡_人工智能研究者应该选择哪款显卡?
  16. android 推送图标大小,设计方法论:一种统一图标大小的方法
  17. Vue中:error ‘XXXXX‘ is not defined no-undef解决办法
  18. 迈阿密大学的计算机系咋样,美国迈阿密大学计算机专业本科.pdf
  19. 正则表达式字符串匹配和字符串提取
  20. 如何在PowerPoint演示文稿中突出显示文本

热门文章

  1. CentOS 7.4搭建Kubernetes 1.8.5集群
  2. Go语言基础语法--注释、基础结构2
  3. php追加编译imagick
  4. Hadoop学习之第七章节:Hive安装配置
  5. 解决打包软链接打包失败问题
  6. 怎么修改gif图片中的文字[实用]
  7. Emacs之slime环境配置
  8. 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)
  9. logic:equal 标签的使用(转)
  10. logicaldoc 6.5 结合postgresql 9.x安装部署—基于windows平台