Java 简单工厂模式和工厂模式(类图及实现)
文章目录
- 一. 工厂模式概要
- 二.简单工厂模式
- 三. 工厂模式
一. 工厂模式概要
- 理解:用factory模式代替使用new创建对象,实现了创建者和调用者的分离,方便维护对象。
- 实现方式:是面向接口编程
- 主要遵循:开闭原则,对类可以扩展,但是不允许对类修改。
这原则核心思想,宁愿多创建几个类,也不要去修改已经写好的类,但如果是系统逻辑的错误,可以修改类。
面向对象设计基本原则:
原则 | 说明 |
---|---|
开闭原则 | 软件实体应该是可扩展的,而不可修改的 |
里氏替换原则\color {red}{里氏替换原则}里氏替换原则 | 子类必须能够替换其基类,保证继承复用的基础 |
依赖倒转原则 | 依赖于抽象,高层模块不依赖于底层模块,二者都同依赖于抽象 |
单一职责 | 一个类,只做一件事并且做好 |
接口隔离原则 | 使用多个小的专门的接口,而不要使用一个大的总接口 |
迪米特法则 | 如果两个类之间无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用 |
模式 | 说明 |
---|---|
简单工厂模式 | 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)(违反开闭原则) |
工厂模式 | 用来生产同一等级结构中的固定产品。(支持增加任意产品) |
抽象工厂 | 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族) |
二.简单工厂模式
创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了。违背了设计模式的开闭原则,如果你要增加其他产品,就必须对工厂进行改建。
例如我开了奔驰公司想要生产A系列的车和B系列的车,首先定义接口,创建两种车的类,和工厂类,就可以生产车了。
类图:
实现代码:
interface car {public void run();
}class carA implements car {public void run(){System.out.println("carA 时速100km");}
}class carB implements car {public void run(){System.out.println("carB 时速200km");}}
//如果生产C系列的车
class carC implements car { public void run(){System.out.println("carC 时速300km");}}class Factory {public car createCar(String name){if (name.equalsIgnoreCase("carA")) {return new carA();}else if (name.equalsIgnoreCase("carB")) {return new carB();}return null;}
}class SimpleFactoryClient{public static void main(String[] args) {Factory factory = new Factory();car car1= factory.createCar("carA"); //给个名,工厂就生产car1.run();car car2= factory.createCar("carB");car2.run();car car3= factory.createCar("carC");car3.run();}
}
如果改天想生产C系列的车carC,就得先造carC的类,但是要想完成对carC的生产,此时只能去修改工厂类,在里面添加一个新的方法,制造carC,但是不符合开闭原则。
三. 工厂模式
- 解决简单工厂方法模式的缺点:使用工厂方法模式为每一种产品生成一个对应的工厂。
- 工厂方法模式的核心思想:讨论的仍然是如何构建同一类型产品(都实现同一个接口)的问题,只不过每个工厂只生产一种特定的产品。
- 优势:是当以后需要增加新的产品时,直接新增加一个对应的工厂就可以了,而不是去修改原有的工厂
奔驰厂商优化生产线类图:
实现
interface car {public void run();
}class carA implements car {public void run(){System.out.println("carA 时速100km");}
}class carB implements car {public void run(){System.out.println("carB 时速200km");}}
//如果生产C系列的车
class carC implements car { public void run(){System.out.println("carC 时速300km");}}interface CarFactory {public car creatCar();
}
class CarAFactory implements CarFactory {public car creatCar(){return new carA();};
};
class CarBFactory implements CarFactory {public car creatCar(){return new carB();};
};
class CarCFactory implements CarFactory { //生产新车了public car creatCar(){return new carC();};
};public class FactoryClient {public static void main(String[] args) {car car1 =new CarAFactory().creatCar(); car car2= new CarBFactory().creatCar();car car3= new CarCFactory().creatCar();car1.run();car2.run();car3.run();}
}
优缺点
- 优点:不直接在客户端创建具体产品的实例,降低了耦合性。
- 缺点:每增加一种产品就要相应的增加一个工厂类,比较繁琐。
技术要点总结
- 构建的都是同一类型的对象,即实现相同的接口
- 每一类对象对应一个工厂
欠的有一天不得不补回来 (| _ |)
参考
Java 简单工厂模式和工厂模式(类图及实现)相关推荐
- Java设计模式(二):UML 类图和概述
目录 一·UML类图 1.1 UML 基本介绍 1.2 UML 图 1.3 UML 类图 1.4 类图-依赖关系 ( Dependence) 1.5 类图-泛化关系(generalization) 1 ...
- java报告:小不点超市售货系统类图设计
由于不是我自己的作业,就偷工减料了,没写缓存系统和后台自动保存 这里只放类图,没有源码!!!抄代码可耻!!!!
- 分析一下 原型模式的 UML 类图 。 复制对象, 深浅拷贝 月经贴 ,请回避
转载于:https://www.cnblogs.com/ganmk--jy/p/5574662.html
- 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想
菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦.情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的.同事的建议是采用简单工厂,耦合就耦 ...
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...
- Java设计模式之策略模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式(四):结构性模式(适配器模式、桥接模式、装饰模式、组合模式、外观模式、亨元模式、代理模式)
目录 一· 适配器设计模式 1.1 现实生活中的适配器例子 1.2 基本介绍 1.3 工作原理 1.4 类适配器模式 1.5 对象适配器模式 1.6 接口适配器模式 1.7 适配器模式在 Spring ...
- iOS开发 - 面向对象设计的设计模式(一):创建型模式(附 Demo UML类图)
继上一篇的面向对象设计的设计原则,本篇是面向对象设计系列的第二个部分:面向对象设计的设计模式的第一篇文章. 另外,本篇博客的代码和类图都保存在我的GitHub库中:中的Chapter2. 最开始说一下 ...
- 23种设计模式【全】 包含:模式定义 使用场景 实现步骤 优缺点 模式区别 UML类图 示例代码 注意项等
23种设计模式(全) ***项目地址***:[GitHub](https://github.com/yjhroot/design-pattern) 声明 模式分类(3大类) 创建型模式(共5种) 结构 ...
- java学习之设计模式-享元模式
享元模式 概述 定义: 运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量.避免大量相似对象的开销,从而提高系统资源的利用率. 结构 享元(Flywe ...
最新文章
- 前端面试题(html篇)
- css:hover选择器
- Zabbix如何实现Server和Agent的通信加密
- SpringBoot+JsTree实现在编辑时能选择树形结构并获取选中的ID
- [PKUWC2018][loj2541]猎人杀
- promise设置多个接口并行调用
- 循环链表实现两个多项式相加主要代码
- 2020科目一考试口诀_二级建造师考试科目有哪些2020
- mysql 单表查询
- Shiro系列-Authenticator和AuthenticationStrategy是什么
- 数学公式的规约(reduce)和简化(simplify)
- Atitit 分布式之道 attilax著 第4章 通信 第7章 一致性和复制 第8章 容错性 第9章 安全性 第10章 基于对象的分布式系统 第11章 分布式文件系统 第12章 基于Web的分
- foxmail的邮局和端口_Foxmail如何进行POP、SMTP设置(pop)
- ipxspx协议linux,三大协议 TCPIP NETBIOS IPX (转)
- LibVLC —— 《基于Qt的LibVLC专业开发技术》视频教程
- 西方文学名著鉴赏——英文诗歌翻译赏析
- OPENGL中GLAD的代码实现过程
- java开发人员的小习惯
- 享元模式实例与解析实例二:共享网络设备(有外部状态)
- 2417. Loan Repayment
热门文章
- python使用matplotlib可视化矢量流场图、使用streamplot函数可视化矢量流场图、矢量流场图包含坐标和方向
- 大漠插件ocr多选字库_大漠ocr识别字库的生成,和使用方法
- maven项目中配置pom.xml引用ojdbc14.jar出错
- maven下载 oracle 驱动包com.oracle:ojdbc14:jar
- 人脸识别Demo解析C#
- CocosCreator代码混淆加密
- 公交车管理系统C语言
- dcp9020cdn硒鼓!错误_打印机硒鼓错误是什么意思?故障解决【详解】
- 社区团购微信小程序开发
- chrome书签搜索