前言  

  在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(Java语言)- 简单工厂模式 介绍了简单工厂模式,然后总结了简单工厂模式的缺点:

    1、当新增类型时,我们不得不修改原来的工厂,这样就违背了设计模式6大原则中的 开闭原则。

    2、简单工厂模式使用了静态方法来创建对象,因此无法被实现或继承,从而导致改工厂类缺少灵活性,不易拓展。

    3、所有的类的创建都需要这个工厂类,因此系统已工厂类是强依赖的关系,一旦工厂类出现错误,将对整个系统产生比较大的影响。

  工厂方法模式就是解决上简单工厂模式的缺点。工厂方法模式UML类图:

  创建工厂方法模式步骤

  1、创建抽象产品类,定义接口。

  2、创建抽象工厂,定义具体工厂的接口。

  3、创建具体的产品类

  4、创建具体的工厂类

  5、客户端调用工厂类创建对象

  

  应用案例

  本模式我们加ing继续使用创建手机作为例子来讲解。我们根据上面的步骤来完成创建手机的流程:

  第一步定义抽象工厂方法:
/**
* @className: IphoneFactory
* @description: iphone手机工厂类
* @author: rainple
* @create: 2020-01-21 20:52
**/
public class IphoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
Iphone iphone = new Iphone();
iphone.setName("iphone手机");
return iphone;
}
}
  第二步创建抽奖产品类
/**
* @InterfaceName: Phone
* @description: 抽象手机
* @author: rainple
* @create: 2020-01-21 20:48
**/
public abstract class Phone { private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
  第三步创建具体产品类
/**
* @className: Iphone
* @description:
* @author: rainple
* @create: 2020-01-21 20:51
**/
public class Iphone extends Phone { } /**
* @className: HuaWeiPhone
* @description: 华为手机
* @author: rainple
* @create: 2020-01-21 20:52
**/
public class HuaWeiPhone extends Phone { }
  第四步创建具体的工厂方法
/**
* @className: HuaWeiFactory
* @description: 华为手机工厂
* @author: rainple
* @create: 2020-01-21 21:04
**/
public class HuaWeiFactory implements PhoneFactory {
@Override
public Phone createPhone() {
HuaWeiPhone huaWeiPhone = new HuaWeiPhone();
huaWeiPhone.setName("华为手机");
return huaWeiPhone;
}
} /**
* @className: IphoneFactory
* @description: iphone手机工厂类
* @author: rainple
* @create: 2020-01-21 20:52
**/
public class IphoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
Iphone iphone = new Iphone();
iphone.setName("iphone手机");
return iphone;
}
}
  第五步客户端调用
/**
* @className: Client
* @description: 客户端
* @author: rainple
* @create: 2020-01-21 21:06
**/
public class Client { public static void main(String[] args) {
//iphone工厂
PhoneFactory phoneFactory = new IphoneFactory();
//创建iPhone手机
Phone phone = phoneFactory.createPhone();
System.out.println(phone.getName());
//华为工厂
phoneFactory = new HuaWeiFactory();
//创建华为手机
System.out.println(phoneFactory.createPhone().getName());
} }

  

  总结

  一、优点

    1、遵循开闭原则,新增产品类时只需要增加相应的工厂以及产品即可,不需要修改原有的代码。

    2、符合单一职责原则,每个工厂类只负责一种产品的创建

    3、使用非静态方法来创建产品,利于后续对产品的拓展,可拓展性增加

  二、缺点

  • 每次增加新的产品时都需要对应的添加工厂类,当产品越来越多时系统创建类就越多,越来越复杂,不利于后期的维护。同时,类的创建和销毁可能会对系统造成一定的开销。
  • 一个工厂只能创建一种产品

  

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

  1. 重学 Java 设计模式:实战工厂方法模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  2. java设计模式-----2、工厂方法模式

    再看工厂方法模式之前先看看简单工厂模式 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的 ...

  3. Java设计模式3:工厂方法模式

    工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...

  4. Java描述设计模式(03):工厂方法模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.工厂方法模式 1.生活场景 系统常见的数据导出功能:数据导出PDF.WORD等常见格式. 2.工厂方法模式 是类的创建模式,又叫做虚拟构造 ...

  5. 《JAVA设计模式》之工厂方法模式 (Factory)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...

  6. [设计模式]<<设计模式之禅>>工厂方法模式

    1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...

  7. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

  8. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  9. C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】

    一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...

  10. 设计模式C++实现——工厂方法模式

    模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...

随机推荐

  1. java编程规范大全

    JAVA编程规范大全 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失.(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性 ...

  2. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(开篇)

    源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c     这是一个比较简单 ...

  3. Find工具

    Find工具主要用于操作系统文件.目录的查找, 1.语法参数格式为: Find工具的语法格式:find path(路径) -option(参数) action(动作): PATH路径:可以任意路径.绝 ...

  4. CP防火墙备份与还原

    Step1:进入专家模式 ====================================================== 如果没有设置专家模式的密码,执行下面命令进行设置: BJ-OFF ...

  5. Android studio相关设置及实现存在于工程目录中的视频播放

    一:相关设置 1:主题设置 File-->Settings-->Appearance &Behavior-->Appearance-->THeme 2:Java源码的颜 ...

  6. Caffe源码-几种优化算法

    SGD简介 caffe中的SGDSolver类中实现了带动量的梯度下降法,其原理如下,\(lr\)为学习率,\(m\)为动量参数. 计算新的动量:history_data = local_rate * ...

  7. Docker 说明

    一.Docker 是什么? 1.为什么会有 Docker 出现 ? 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得 ...

  8. JavaScript之DOM操作,事件操作,节点操作

    1,DOM操作 1.1  概念 所谓DOM,全称Document Object Model 文档对象模型,DOM是W3C(World Wide Web Consortuum )标准,同时也定义了访问诸 ...

  9. 【题解】毒蛇越狱(FWT+容斥)

    [题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ...

  10. 【一起学源码-微服务】Nexflix Eureka 源码五:EurekaClient启动要经历哪些艰难险阻?

    前言 在源码分析三.四都有提及到EurekaClient启动的一些过程.因为EurekaServer在集群模式下 自己本身就是一个client,所以之前初始化eurekaServerContext就有 ...