java 工厂模式的写法_[java设计模式] 工厂模式解析
什么是工厂模式?
我的总结是: 遵守软件设计中的开闭原则和依赖反转原则, 并且客户端只需通过参数来创造多个对象, 并且在创建过程中,创建对象的过程对客户端是透明的. 这种开发模式叫做工厂模式.
出现原因.
我们在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设计模式] 工厂模式解析相关推荐
- Java多线程相关知识【17】--设计模式--上下文模式(Context)
文章目录 Java多线程相关知识[17]--设计模式--上下文模式(Context) 1. 问题的引入 2. 解决方法 1. 解决理论 2. 实操代码 上下文数据保存 上文 下文 调度者 测试上下文 ...
- java 工厂模式的写法_设计模式-Java-简单工厂模式--BitmapFactory
上一篇,我们说了下MonkeyLei:设计模式-Java-观察者模式-RxJava 其中还利用到了反射的知识,另外也附上了很多我觉得分析还可以的链接. 这里我们看看简单工厂这块.除了这个还有其他几个: ...
- java 工厂模式的写法_Java23种设计模式之抽象工厂模式
概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...
- 【Java萌新】面试常问设计模式——工厂模式
临近秋招,备战暑期实习,祝大家每天进步亿点点!Day17 本篇总结的是 工厂设计模式,后续会每日更新~ 1.工厂模式简介 ⼯⼚模式介绍:它提供了⼀种创建对象的最佳⽅式,在创建对象时 不会对客户端暴露创 ...
- java final类的写法_重拾JavaSE基础——抽象类、接口、代码块、final和枚举
今天继续回顾Java基础,有些东西用得不多,大家看看知道语法就好 主要内容 抽象类 抽象方法 抽象方法的写法 抽象方法是否可以私有化 抽象类的特征 抽象类有无构造器,能否实例化对象 抽象类的结构 抽象 ...
- java 微信群发多图文_[Java教程]httpClient实现微信公众号消息群发
[Java教程]httpClient实现微信公众号消息群发 0 2016-09-21 20:00:10 1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信ope ...
- java类全路径简写_[JAVA] JAVA 类路径
Java 类路径 类路径是所有包含类文件的路径的集合. 类路径中的目录和归档文件是搜寻类的起始点. 虚拟机搜寻类 搜寻jre/lib和jre/lib/ext目录中归档文件中所存放的系统类文件 搜寻再从 ...
- java对数字的处理_[java初探10]__关于数字处理类
前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...
- java 工厂模式的写法_设计模式-工厂模式
一.概述 什么是工厂模式? 工厂模式(Factory Pattern)是最常见的一种设计模式之一.它主要是提供一种创建对象的最佳方法! 为什么要学习工厂模式? 与通过new来创建对象不同,使用工厂模式 ...
最新文章
- 【linux】——linux下的软件安装
- 手势检测的回调方法中onfling与onscroll的区别
- 用C++11的std::async代替线程的创建
- Ninject学习笔记三
- centos安装django
- mysql在linux下备份还原,Linux下MySQL的备份与还原
- cad标注桩号lisp_cad桩号标注插件下载
- 手机和工业计算机运算能力对比,手机CPU和电脑CPU性能相差多少 手机CPU和电脑CPU性能对比...
- Sentaurus Process Device
- 51单片机控制数码管显示hello,012345,以及apple自动切换
- 计算机word文档无法工作,教您电脑word打不开怎么办
- CodeForces128A - Statues 解题报告
- 【漆天编程】MT4和MT5有什么区别?这是我见到过的最好的回答
- matlab .m 返回值,MATLAB一个M文件的function返回值怎么在另一个M文件中的函数调用这个返回值?...
- 专为博客们设计的概念产品bloger | 奇事奇物网
- php 带http的域名,php提取URL中的域名部分
- 计算机程序设计艺术读后感,计算机程序设计艺术(第1卷)读后感1000字
- Python学习笔记:个税起征点上调至5000,算一算少交多少税?
- 前后台数据加密(java版)
- Linux设备树led,linux设备树下LED灯控制
热门文章
- c语言 linux取运行目录,c语言获取当前工作路径的实现代码(windows/linux)
- 剑灵选区界面一直正在连接服务器,如何选择服务器 选择困难症的指南
- android 高德地图纠偏,高德地图纠偏算法(android ,ios)
- 计算机应用房地产,房地产板块弱市吸金 逾30亿撤离计算机应用板块
- c语言程序设计1试卷,(C语言程序设计期末试卷1.doc
- servlet增删改查实例_SpringBoot系列(2)整合MongoDB实现增删改查(完整案例)
- 不用工具箱的神经网络matlab程序_MATLAB中的神经网络工具箱(2)函数命令及模型搭建...
- iphonex如何关机_iPhone X手机屏幕出现绿线怎么回事_屏幕绿线该如何处理?
- sqlrelay mysql_数据库连接池SQL Relay安装使用-Java架构师必看
- 大雁塔为什么七层_“大唐不夜城”广场旁边的千年古佛塔为何被叫“大雁塔”?...