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

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

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

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

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

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

  二、应用案例: 

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

/**
* 手机类
*/
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. ZCU104搭建Ubuntu桌面系统-1安装Petalinux

    参考教程: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841948/Zynq+UltraScalePlus+MPSoC+-+Ubu ...

  2. 初学 Spring MVC(基于 Spring in Action)

    Spring MVC(Model-View-Controller) 当你看到本博文时,我猜你可能正面临着我已探索过的问题. 同其他博主一样,我先按照书上详细的介绍一下 Spring MVC,也是为了自 ...

  3. Web渗透之mssql LOG备份getshell

    log备份的总结 当SQL注入是得到DB权限时候,接下来可以做的工作很多,象找管理员密码,后台管理这些都可以帮助你拿到WEBSHELL,但是这篇文章讲的是log备份,LOG备份出来的小马的体积小,而且 ...

  4. Cymothoa后门工具

    Cymothoa是一款隐秘的后门工具. 发现网上对于Cymothoa的文章并不是很多,可是Cymothoa又是一款非常强大的后门工具,这里记录下Cymothoa的使用笔记. Cymothoa 是一款可 ...

  5. SpringMVC4拦截器配置遇到的坑

    目的:对get请求添加token验证(若为post请求可通过RequestBodyAdvice实现). 情景:因为有api版本管理的需求,重写了WebMvcConfigurationSupport类的 ...

  6. 阿里云 centos7.X mysql数据库安装、配置

    前言 1024阿里云搞活动,ecs云服务新用户促销活动,活动连接就不贴了,买了之后暂时不知道要做啥,想着先安装mysql数据库. 步骤 root用户登录进来 1.配置mysql的yum源,yum lo ...

  7. fullpage.js的引入方法

    1.先到官网上(https://github.com/alvarotrigo/fullPage.js)下载压缩包 2.引入文件 3.布局基本页面结构 4.实现全屏滚动(JS代码) <script ...

  8. C++沉思录笔记 —— 序幕

    #include <stdio.h>   class Trace{public: void print(const char* s) { printf("%s\n", ...

  9. [正确配置]win7 PL/SQL 连接Oralce 11g 64位

    PL/SQL 版本号:15.0.5.1710 32位 win7 64位系统 instantclient 12.1 32位,PL/SQL不支持64位 关键问题 1.Not logged on 2.没有c ...

  10. recovery模式差分(增量)升级小结

    最近在做recovery模式下的升级,简单的总结一下. 先说说recovery模式,他是个升级小系统,有单独的kernel,通过特定的系统命令就可以进入到此系统中,选择进入正常系统的kernel还是r ...