简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式。简单工厂模式通过对外提供一个静态方法来统一为类创建实例。简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建出来的,只需要调用简单工厂模式的方法来统一创建就可以了,从而明确了各个类的职责。

  一、创建简单工厂模式的步骤

  第一步:声明一个抽象类(接口),以及对应的抽象方法,由实现类分别去实现这个方法。

  第二步: 创建具体实现类,实现抽象方法。

  第三步:创建一个简单工厂类,声明一个静态方法,根据传入的不同的类型来确定创建抽象类的具体实现类。

  第四步:客户端通过工厂类获取实例对象。

  二、应用案例: 

  下面以制造手机为例子,在现实生活中可能有很多工厂可以创建不同品牌的手机,这些工厂可以根据不同的需求来创建不同的手机。根据上面的步骤,首先我们需要一个抽象类,所以我们需要知道不同品牌的手机其实都是属于手机这种类别,因此我们可以将手机抽出来做成一个抽象类:

/**
* 手机类
*/
public interface Phone {
//制造手机的方法,留给具体的实现类来制造
void create();
}

  第二步我们需要开始制造不同品牌的手机了:

  制造华为手机

public class Huawei implements Phone {
@Override
public void create() {
System.out.println("====正在制造华为手机======");
}
}

  苹果手机

public class Iphone implements Phone {
@Override
public void create() {
System.out.println("====正在制造苹果手机======");
}
}

  第三步我们需要创建一个工厂方法,返回手机类。具体制造什么品牌的手机,需要根据传进来的手机名字来决定,因此我们可以这么写:

public class SimpleFactory {

    public static Phone createPhone(String name) {
if ("huawei".equals(name))
return new Huawei();
else
return new Iphone(); } }

  第四步,手机创建好了,我们就可以使用了,即客户端调用工厂方法创建对象实例

public class Client {

    public static void main(String[] args) {
Phone huawei = SimpleFactory.createPhone("huawei");
huawei.create(); Phone iphone = SimpleFactory.createPhone("iphone");
iphone.create();
} } //输出结果

====正在制造华为手机======
====正在制造苹果手机======

  到这里,简单工厂模式基本已经写完了,仔细看会发现这种方法创建对象违反了ocp原则,每次增加不同品牌手机的时候都需要在工厂方法里添加不同的条件判断。如果手机品牌越来越多,代码看起来非常臃肿,很不利于后期的代码维护。因此,我们改进一下,不要通过手机品牌名称来判断需要创建哪一中对象了,而是客户端想要创建什么对象,只需要传入具体的实现类就可以了,然后通过Java的反射来创建对象。

public class SimpleFactory2 {

    public static Phone create(Class<? extends Phone> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
} }

  客户端调用

public class Client {

    public static void main(String[] args) {
Phone huawei = SimpleFactory2.create(Huawei.class);
huawei.create(); Phone iphone = SimpleFactory2.create(Iphone.class);
iphone.create();
} }
//运行结果

====正在制造华为手机======
====正在制造苹果手机======

  经过修改之后,每次增加新的手机品牌时就不用修改工厂方法的逻辑了。但是,还是有一个问题,就是每次创建对象都是通过反射来创建的,所以在性能上是有一定的损耗的。

  三、总结:

  优点:

    1、简单优化了软件体系结构,明确了各自功能模块的职责和权利

    2、通过工厂类,外界不需要直接创建具体产品对象,只需要负责消费,不需要关心内部如何创建对象

  缺点:

    1、改进前的简单工厂模式全部创建逻辑都集中在一个工厂类中,能创建的类只能是考虑到的,如果需要添加新的类,就必须改变工厂类了

    2、改进前的简单工厂模式随着具体产品的不断增多,可能会出现共产类根据不同条件创建不同实例的需求,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免功能模块的蔓延,对系统的维护和扩展不利

    3、改进后的简单工厂模式主要是使用反射效率会低一些

设计模式(Java语言)- 简单工厂模式的更多相关文章

  1. java设计模式-----1、简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...

  2. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  3. java 之 简单工厂模式(大话设计模式)

    以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...

  4. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  5. 设计模式(java)--简单工厂模式之女娲造人.水果农场

    女娲抟土造人 话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面. 女娲造人,这就是简单工厂模式的应用.  首先,在这个造人的思 ...

  6. Java描述设计模式(02):简单工厂模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根 ...

  7. Java实现简单工厂模式

    昨天看了一下设计模式,复习了一下简单工厂模式,做个笔记,浅淡一下我对简单工厂模式的理解.书上使用的是C#,因为我所学的是Java,所以本人就用Java实现了一遍.如果有讲的不对的地方,希望能够指出来. ...

  8. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...

  9. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

  10. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

随机推荐

  1. STM32SPI连续读写多个字节会产生时间间隔

    最近在做一个音频芯片的项目用到SPI接口配置寄存器,发现只要连续两次向从机发送(接收)帧,当STM32处于主机模式时,这两帧数据中间会产生一个时钟的间隙. 起初我想能不能利用状态标志来去除间隙,后来怎 ...

  2. 三种常见字符编码:ASCII、Unicode和UTF-8

    什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...

  3. [Luogu1379]八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...

  4. 概念理解-异步IO

    #include <aio.h> /* 函数名 :int aio_write(struct aiocb *aiocbp) 参 数 :struct aiocb *aiocbp 返回值 :执行 ...

  5. 一个有趣的C语言问题

    这个问题是知乎上的一个问题,看了以后觉得比较有意思.代码短到只有十多行,但是这么短的代码却输出了很奇怪的结果.很多人回答的时候都是站在理论的角度上说明代码的问题,但是实际的问题还是没有说明其中的问题. ...

  6. windows 抓hash获取管理员密码

    webshell 找能执行权限的目录上传 C:\Windows\System32\config\sam 内有windows 密码 利用工具把密码抓出来 samcopy 直接抓取 GetHASHES.e ...

  7. kaldi使用cvte模型进行语音识别

    操作系统 : Unbutu18.04_x64 gcc版本 :7.4.0 该模型在thch30数据集上测试的错误率只有8.25%,效果还是不错的. 模型下载地址: http://www.kaldi-as ...

  8. 020 - FreeRTOS学习路线总结

    零.为什么写? 在H7-tools预售群里,有位朋友提出如何学习FreeRTOS这类的问题,便由此总结下自己的学习路线.最近又打算接触RTT,和FreeRTOS做个对比. 文章分两步来讲,学习路线和学 ...

  9. Swagger Learing - Spring Boot 整合swagger

    学习了一下swagger. 这是编写的Demo 源码 https://github.com/AmberBar/Learning/tree/master/swagger-learning/swagger ...

  10. Kafka权威指南阅读笔记(第八章)

    跨集群数据镜像 使用场景: 区域集群和中心集群 这种场景下,每个区域的应用程序只访问相应的区域内的集群.而有些情况下,需要将各个集群的信息汇总到中心集群,就可以用中心集群分析业务数据了. 冗余 一个K ...