设计模式之工厂模式和抽象工厂模式
工厂模式(实现创建者和调用者的分离,实现解耦)
本质:实例化对象,用工厂方法代替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. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- 021 设计模式之工厂方法模式,抽象工厂模式的区别
简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...
- 设计模式之工厂模式和抽象工厂
设计模式分类 通常来说设计模式分为三大类: 创建型模式,共 5 种:工厂模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共 7 种:适配器模式.装饰器模式.代理模式.外观模式.桥接模 ...
- 设计模式你怎么看?--抽象工厂模式
一 前言 在设计模式中有简单工厂,工厂方法,抽象工厂,这三种工厂方法,各自有各自的特点,但有都有共同的特点 工厂(Factory)都是围绕着工厂类转,这篇只写 "抽象工厂"相关的 ...
- [设计模式篇]工厂模式和抽象工厂模式
最近在看Head First的Design Pattern,想想去年候捷来学校给我们讲Design Pattern,但当时水平太弱根本听不懂,今年想趁机再好好学一波,候捷反而不来了,哎,人生就是这样, ...
- 回顾游戏中的设计模式:策略模式vs抽象工厂
最近有时间看看设计模式方面的书,好多东西时间久了不看就变得生疏起来, 在这里会抽出时间把自己在工作中使用过的设计模式做下总结. 刚才在看到别人说,简单工厂模式是"通过提供单独的一个类,来实现 ...
- 设计模式_1_工厂模式与抽象工厂
工厂模式 工厂模式(创建型模式):创建对象接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建延伸到子类进行 主要解决接口选择问题,明确计划不同条件下执行创建不同实例 通过子类实现工厂实例,创建 ...
- 设计模式之(四)抽象工厂模式(Abstract Factory)
工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...
- Java设计模式之工厂方法模式与抽象工厂模式
2019独角兽企业重金招聘Python工程师标准>>> 一.前期回顾 上一篇<Java设计模式之单例模式>详细介绍了单例模式,介绍了单例模式的使用场景,优缺点,同时也写了 ...
最新文章
- 阿里巴巴电商平台架构演变之路
- R语言使用read.delim函数读取带分隔符的文本文件
- SpringCloud服务消费者第一次调用出现超时问题的解决方案
- 关于共享单车,说点什么
- reactjs组件实例的三大属性之props使用示例:在函数式组件中使用props
- spark sql中的窗口函数
- c++ 暂停功能_2020.10.16撸友简报:NC资本澄清;去嗨皮打赏交易
- linux虚拟机cpu高耗gc,Tomcat服务器-并发压力测试下调优注意点小结 JVM client模式和Server模式的区别 jvm 参数优化---笔记 tomcat查看GC信息...
- 洛谷 P1086 花生采摘
- shell脚本中定义路径变量出现的BUG
- MyEclipse 保护色设置
- 网络编程+并发编程总结
- 01单片机——基础知识
- [Excel] 数据透视图
- 跑深度模型的显卡_人工智能研究者应该选择哪款显卡?
- android 推送图标大小,设计方法论:一种统一图标大小的方法
- Vue中:error ‘XXXXX‘ is not defined no-undef解决办法
- 迈阿密大学的计算机系咋样,美国迈阿密大学计算机专业本科.pdf
- 正则表达式字符串匹配和字符串提取
- 如何在PowerPoint演示文稿中突出显示文本