设计模式之——工厂模式
一、相关概念了解
首先知晓什么是工厂模式(概念)?
①实例化对象,用工厂方法代替new操作。②工厂模式包括工厂方法模式和抽象工厂模式。③抽象工厂模式是工厂方法模式的拓展。
其次明白工厂模式的意图
①定义一个借口来创建对象,但是让子类来决定哪些类需要被实例化。②工厂方法把实例化的工作推迟到子类中去实现。
最后了解什么情况下适合工厂模式?
①有一组类似的对象需要创建。②在编码时不能预见需要创建哪种类的实例。③系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节。
二、几种工厂模式的描述(打比方)
三、主要实现方式
以发型实现为例:
(一)常规方法
1.创建接口,定义实现发型的方法
package Factory.sunny.project; /*** 发型接口* * */ public interface HairInterface {//实现了发型public void draw(); //注意 : 接口中没有方法体 }
2.用相应的类来实现该接口,重写接口内的方法
左偏分发型——
package Factory.sunny.project;public class LeftHair implements HairInterface {@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println("---------左偏分发型------------");} }
右偏分发型——
package Factory.sunny.project;public class RightHair implements HairInterface {@Overridepublic void draw() {// TODO Auto-generated method stub System.out.println("------------右偏分发型----------");}}
3.测试代码(贴一小段主要的)
HairInterface left=new LeftHair();left.draw();
缺点是每来一个发型都需要创建新的...Hair类实现,而且还要在客户端调用,不利于维护......
(二)采用发型工厂方法
1.创建发型工厂
package Factory.sunny.project;import java.util.Map;/*** 发型工厂* */ public class HairFactory {/*** 根据类型创建对象* */ public HairInterface getHair(String key){if("left".equals(key)){//字符放在前面是预防key报空指针return new LeftHair();}else if("right".equals(key)){return new RightHair();}return null; } }
2.测试
HairFactory factory=new HairFactory();HairInterface left=factory.getHair("left");left.draw();
缺点:不智能,判断条件太冗杂,解决办法——>反射
(三)反射方法解决上述问题(一步到位,采取映射)
1.首先看未采取映射办法的代码
//生产发型的方法,为了优化上面代码对于大量发型的大量判断,使用反射原理,类似于spring里的BeanFactorypublic HairInterface getHairByClass(String className){try { HairInterface hair=(HairInterface) Class.forName(className).newInstance();return hair;} catch (InstantiationException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch block e.printStackTrace();}return null; }
2.采取映射的代码(在此之前先要创建properties文件和properties文件读取类)
properties文件
properties文件读取类
package Factory.sunny.project;import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties;/*** properties文件的读取工具* * */ public class ProrpertiesReader {public Map<String,String> getProperties(){Properties props =new Properties();Map<String,String> map=new HashMap<String,String>();//将key和property读入到map中try {InputStream in=getClass().getResourceAsStream("type.properties");props.load(in);Enumeration en=props.propertyNames(); while(en.hasMoreElements()){String key=(String) en.nextElement();String property=props.getProperty(key);map.put(key, property);}} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}return map;}}
反射&映射方法代码
public HairInterface getHairByClasskey(String key){try { Map<String,String> map=new ProrpertiesReader().getProperties();HairInterface hair=(HairInterface) Class.forName(map.get(key)).newInstance();return hair;} catch (InstantiationException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch block e.printStackTrace();}return null; }
3.测试
//反射方法 HairInterface right=factory.getHairByClass("Factory.sunny.project.RightHair"); right.draw();// 反射&映射方法HairInterface hair=factory.getHairByClasskey("right");hair.draw();HairInterface hair2=factory.getHairByClasskey("in");hair2.draw();
转载于:https://www.cnblogs.com/zjfjava/p/6496974.html
设计模式之——工厂模式相关推荐
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- JavaScript设计模式--简单工厂模式例子---XHR工厂
JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...
- 三角形圆形创建与擦除java_设计模式---------------简单工厂模式
设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...
- 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式
设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 设计模式之工厂模式(三)
上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...
- php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式
php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...
- 教你如何一篇博客读懂设计模式之—--工厂模式
一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...
- 一篇博客读懂设计模式之---工厂模式
设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...
- java 工厂模式详解_Java设计模式之工厂模式详解
简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...
最新文章
- 压力测试对于BCH真的有意义吗?
- 批改网破解老师设置禁止复制粘贴的流程
- rocksdb原理_手摸手学习 RocksDB 的 Write Buffer Manager
- 窗体的扩展样式GWL_EXSTYLE:用于SetWindowLong
- 关于ARM的22个常用概念介绍
- C和指针之指针数组和指向数组的指针
- void和void *
- 多线程编程-条件变量
- Oracle典型应用场景--数据迁移到本地测试
- 终于完成词频统计小程序~
- php图片遍历,php – 如何遍历图像的所有像素?
- ROS学习笔记七:使用rqt_console和roslaunch
- android手势创建及识别
- 闽江学院2015-2016学年下学期《软件测试》课程-第六次博客作业
- 安徽省月度降水量分布数据
- vue学习笔记-8-循环结构
- GAN变种介绍 - DCGAN、InfoGAN、CycleGAN、WGAN、Self-Attention GAN、BigGAN
- 项目经理必备的基本职责
- win10 桌面的的文件都不见了 提示不注销保存都文件都为临时_在桌面上创建一个关机快捷方式,只需一条命令,关机速度大幅提升...
- java给txt文件写入内容_java代码 如何向TXT文件写入内容?
热门文章
- 递归过程中语句执行顺序
- LeetCode 2058. 找出临界点之间的最小和最大距离(链表)
- 天池 在线编程 最小的行程(动态规划)
- [scikit-learn 机器学习] 4. 特征提取
- LeetCode 188. 买卖股票的最佳时机 IV(动态规划)
- LeetCode 722. CPP删除注释(逻辑题)
- iis无法读取配置文件_SpringBoot 有很多读取配置文件的方法,你知道几个? 静态方法读取呢?...
- 会理天气预报软件测试,会理天气预报15天
- python数据分析开发环境_在MAC上搭建python数据分析开发环境
- 这可能是最简单又有效的自监督学习方法了