什么是工厂模式?

我的总结是: 遵守软件设计中的开闭原则和依赖反转原则, 并且客户端只需通过参数来创造多个对象, 并且在创建过程中,创建对象的过程对客户端是透明的. 这种开发模式叫做工厂模式.

出现原因.

我们在java中创建对象最入门的方法就是

ClassXXX xx = new ClassXXX();

xx.MM();

但当需要创建的同种类型的对象较多时, 重复的代码就会很多, 这样的写法就显得略过于臃肿, 并且混乱.

于是人们创造了“由一个第三方专门负责创建对象”的这么一种设计模式.

简单来说, 工厂模式分为三步:

总结出要创建的对象的特征, 将其抽象成接口

各类型的实现方法

创造工厂类, 输入接口,输出具体实现类.

废话不多说, 上demo

比如我们想要创建一个乐队, 这个乐队有吉他手,有钢琴手. 假设我们想要像流水线一样生产这群成员.

按工厂模式的步骤, 我们首先创建出乐器的规则(即接口) (假设我们不需要活人,有乐器就可以自动弹奏)

public interface Instrument {

public void play();

}

以及两个乐器的实现类, 钢琴和吉他.

public class Guitar implements Instrument{

@Override

public void play() {

System.out.println("playing guitar");

}

}

public class Piano implements Instrument {

@Override

public void play() {

System.out.println("playing Piano");

}

}

这样, 我们的第一步和第二步就完成了.

下面是第三步, 创建工厂方法

public class InstrumentFactory {

public Instrument export(String inst){

if (inst=="guitar"){

return new Guitar();

}

return new Piano();

}

}

这样, 一个最简单的工厂模式就出来了.

我们在main 方法中调用

public class Main {

public static void main(String[] args) {

InstrumentFactory factory = new InstrumentFactory();

factory.export("guitar").play();

factory.export("piano").play();

}

结果是:

playing guitar

playing Piano

当然, 程序如果这样写, 肯定是不行的. 关键点在于factory的输入太过于不专业.

所以, 下面我们对这个最简单的工厂模式做一下改良.

我们使用泛型改一下factory的输入.

public class InstrumentFactory {

public Instrument export(Class extends Instrument> instClass) throws IllegalAccessException, InstantiationException {

return instClass.newInstance();

}

}

而在main方法里, 只需要将输入由String改成class即可

InstrumentFactory factory = new InstrumentFactory();

factory.export(Guitar.class).play();

factory.export(Piano.class).play();

这样, 一个最简单的工厂模式就被写出来了. 很简单吧? 我们在研究JDK源码或Spring源码(尤其是Spring底层的Spring Data时), 他们使用的工厂模式和我们写的这个工厂模式也没有太大的区别. 很多时候研究源码觉得眼花缭乱,是因为很多的源码都是把多种设计模式混在一起. 如果我们把设计模式各个击破, 再去看源码,就会有“一览众山小”的感觉了.

你以为这样就结束了吗?

我们还差一步. 上面的部分仅仅是一个简单的工厂模式, 实际上它就叫做简单工厂模式(“Simple Factory Pattern”). 在GOF的23种设计模式里, 简单工厂模式是并不在其中的.

我们想要让你的代码登上大雅之堂, 还是需要做一番改良, 让他更符合标准.

这时我们就需要思考了, 我们的简单工厂模式哪里有问题呢? 或者说, 哪里不规范呢?

我们会发现, 我们创建的工厂是一个“万能工厂”,它既能造吉他, 也能造钢琴. 世界上有这样的工厂吗? 也许有, 但是在软件的世界里, 不要忘了还有一个原则叫“单一职责”的原则.

我在这篇文章的开头提到了开闭原则和依赖倒置原则. 这两个原则的意思是: 一个软件,或是一种功能,要对修改关闭, 对扩展开放, 简而言之就是易于扩展, 可多处复用. 以及, 要让底层依赖高层, 而不是高层依赖底层.

那么单一职责原则又是什么呢?

行话叫做: 不能存在多于一个导致类变更的原因.

在我们创建的factory中, guita的实现和piano的实现都会导致factory类被改变.

所以我们要修复一下这个问题.

我们可以把factory抽象出来, 并用多个工厂实现工厂的抽象类. 让一个工厂只负责一种对象.

public interface IFactory {

public void play();

}

public class GuitaFactory implements IFactory {

@Override

public Instrument generate() {

return new Guitar();

}

}

public class PianoFactory implements IFactory{

@Override

public Instrument generate() {

return new Piano();

}

}

在main 方法中, 我们使用以下方法使用出厂的乐器

IFactory guitarFactory = new GuitaFactory();

IFactory pianoFactory = new PianoFactory();

guitarFactory.generate().play();

pianoFactory.generate().play();

这就是一个标准的工厂模式.

你的代码终于可以带上规范化的标签, 登上GOF24的大雅之堂, 与各类高手坐在一起谈笑风生了.

java 工厂模式的写法_[java设计模式] 工厂模式解析相关推荐

  1. Java多线程相关知识【17】--设计模式--上下文模式(Context)

    文章目录 Java多线程相关知识[17]--设计模式--上下文模式(Context) 1. 问题的引入 2. 解决方法 1. 解决理论 2. 实操代码 上下文数据保存 上文 下文 调度者 测试上下文 ...

  2. java 工厂模式的写法_设计模式-Java-简单工厂模式--BitmapFactory

    上一篇,我们说了下MonkeyLei:设计模式-Java-观察者模式-RxJava 其中还利用到了反射的知识,另外也附上了很多我觉得分析还可以的链接. 这里我们看看简单工厂这块.除了这个还有其他几个: ...

  3. java 工厂模式的写法_Java23种设计模式之抽象工厂模式

    概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  4. 【Java萌新】面试常问设计模式——工厂模式

    临近秋招,备战暑期实习,祝大家每天进步亿点点!Day17 本篇总结的是 工厂设计模式,后续会每日更新~ 1.工厂模式简介 ⼯⼚模式介绍:它提供了⼀种创建对象的最佳⽅式,在创建对象时 不会对客户端暴露创 ...

  5. java final类的写法_重拾JavaSE基础——抽象类、接口、代码块、final和枚举

    今天继续回顾Java基础,有些东西用得不多,大家看看知道语法就好 主要内容 抽象类 抽象方法 抽象方法的写法 抽象方法是否可以私有化 抽象类的特征 抽象类有无构造器,能否实例化对象 抽象类的结构 抽象 ...

  6. java 微信群发多图文_[Java教程]httpClient实现微信公众号消息群发

    [Java教程]httpClient实现微信公众号消息群发 0 2016-09-21 20:00:10 1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信ope ...

  7. java类全路径简写_[JAVA] JAVA 类路径

    Java 类路径 类路径是所有包含类文件的路径的集合. 类路径中的目录和归档文件是搜寻类的起始点. 虚拟机搜寻类 搜寻jre/lib和jre/lib/ext目录中归档文件中所存放的系统类文件 搜寻再从 ...

  8. java对数字的处理_[java初探10]__关于数字处理类

    前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...

  9. java 工厂模式的写法_设计模式-工厂模式

    一.概述 什么是工厂模式? 工厂模式(Factory Pattern)是最常见的一种设计模式之一.它主要是提供一种创建对象的最佳方法! 为什么要学习工厂模式? 与通过new来创建对象不同,使用工厂模式 ...

最新文章

  1. 【linux】——linux下的软件安装
  2. 手势检测的回调方法中onfling与onscroll的区别
  3. 用C++11的std::async代替线程的创建
  4. Ninject学习笔记三
  5. centos安装django
  6. mysql在linux下备份还原,Linux下MySQL的备份与还原
  7. cad标注桩号lisp_cad桩号标注插件下载
  8. 手机和工业计算机运算能力对比,手机CPU和电脑CPU性能相差多少 手机CPU和电脑CPU性能对比...
  9. Sentaurus Process Device
  10. 51单片机控制数码管显示hello,012345,以及apple自动切换
  11. 计算机word文档无法工作,教您电脑word打不开怎么办
  12. CodeForces128A - Statues 解题报告
  13. 【漆天编程】MT4和MT5有什么区别?这是我见到过的最好的回答
  14. matlab .m 返回值,MATLAB一个M文件的function返回值怎么在另一个M文件中的函数调用这个返回值?...
  15. 专为博客们设计的概念产品bloger | 奇事奇物网
  16. php 带http的域名,php提取URL中的域名部分
  17. 计算机程序设计艺术读后感,计算机程序设计艺术(第1卷)读后感1000字
  18. Python学习笔记:个税起征点上调至5000,算一算少交多少税?
  19. 前后台数据加密(java版)
  20. Linux设备树led,linux设备树下LED灯控制

热门文章

  1. c语言 linux取运行目录,c语言获取当前工作路径的实现代码(windows/linux)
  2. 剑灵选区界面一直正在连接服务器,如何选择服务器 选择困难症的指南
  3. android 高德地图纠偏,高德地图纠偏算法(android ,ios)
  4. 计算机应用房地产,房地产板块弱市吸金 逾30亿撤离计算机应用板块
  5. c语言程序设计1试卷,(C语言程序设计期末试卷1.doc
  6. servlet增删改查实例_SpringBoot系列(2)整合MongoDB实现增删改查(完整案例)
  7. 不用工具箱的神经网络matlab程序_MATLAB中的神经网络工具箱(2)函数命令及模型搭建...
  8. iphonex如何关机_iPhone X手机屏幕出现绿线怎么回事_屏幕绿线该如何处理?
  9. sqlrelay mysql_数据库连接池SQL Relay安装使用-Java架构师必看
  10. 大雁塔为什么七层_“大唐不夜城”广场旁边的千年古佛塔为何被叫“大雁塔”?...