一、相关概念了解

首先知晓什么是工厂模式(概念)?

  ①实例化对象,用工厂方法代替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

设计模式之——工厂模式相关推荐

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

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

  2. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  3. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  4. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  5. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  6. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  7. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  8. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  9. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

  10. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. 压力测试对于BCH真的有意义吗?
  2. 批改网破解老师设置禁止复制粘贴的流程
  3. rocksdb原理_手摸手学习 RocksDB 的 Write Buffer Manager
  4. 窗体的扩展样式GWL_EXSTYLE:用于SetWindowLong
  5. 关于ARM的22个常用概念介绍
  6. C和指针之指针数组和指向数组的指针
  7. void和void *
  8. 多线程编程-条件变量
  9. Oracle典型应用场景--数据迁移到本地测试
  10. 终于完成词频统计小程序~
  11. php图片遍历,php – 如何遍历图像的所有像素?
  12. ROS学习笔记七:使用rqt_console和roslaunch
  13. android手势创建及识别
  14. 闽江学院2015-2016学年下学期《软件测试》课程-第六次博客作业
  15. 安徽省月度降水量分布数据
  16. vue学习笔记-8-循环结构
  17. GAN变种介绍 - DCGAN、InfoGAN、CycleGAN、WGAN、Self-Attention GAN、BigGAN
  18. 项目经理必备的基本职责
  19. win10 桌面的的文件都不见了 提示不注销保存都文件都为临时_在桌面上创建一个关机快捷方式,只需一条命令,关机速度大幅提升...
  20. java给txt文件写入内容_java代码 如何向TXT文件写入内容?

热门文章

  1. 递归过程中语句执行顺序
  2. LeetCode 2058. 找出临界点之间的最小和最大距离(链表)
  3. 天池 在线编程 最小的行程(动态规划)
  4. [scikit-learn 机器学习] 4. 特征提取
  5. LeetCode 188. 买卖股票的最佳时机 IV(动态规划)
  6. LeetCode 722. CPP删除注释(逻辑题)
  7. iis无法读取配置文件_SpringBoot 有很多读取配置文件的方法,你知道几个? 静态方法读取呢?...
  8. 会理天气预报软件测试,会理天气预报15天
  9. python数据分析开发环境_在MAC上搭建python数据分析开发环境
  10. 这可能是最简单又有效的自监督学习方法了