前言  

  在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(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. P1039 大规模间谍入侵

    题目描述 爱丽丝魔法王国成立10周年,于是决定矩形国庆大阅兵. 在国庆大阅兵期间,为了防止暗黑王国的间谍乔装成平民混入,需要对每一个进城的人做检测. 因为暗黑王国的人长得和爱丽丝魔法王国的人长得很像, ...

  2. 圆角效果 border-radius——阴影 box-shadow——为边框应用图片 border-image

    1.圆角效果 border-radius border-radius: 5px 4px 3px 2px; /* 四个半径值分别是左上角.右上角.右下角和左下角,顺时针 */ 不要以为border-ra ...

  3. 学习Java第六周

    1.内存结构 Java程序在运行时,需要在内存中的分配空间为提高运算效率,空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 栈内存 ·用于存储局部变量,当数据使用完,所占 ...

  4. (1)51单片机NOP指令

    提问:什么是NOP指令?干什么用的?单片机程序里执行一条nop指令需要多长时间? (1)一个NOP就是一个机器周期 (2)空指令,延时一个机器周期 (3)这个与单片机型号.指令类型和使用的晶振频率有关 ...

  5. IAP升级

    一.IAP原理 1.在正常情况下,程序运行路流程: 和STM32类似,STM8内部闪存(FLASH)地址起始于 0x8000(STM32是0x08000000),一般情况下,程序文件就从此地 址开始写 ...

  6. 最长公共前缀 leetcode 14

    方法一(纵向扫描) 解题思路 先计算出数组中最小的字符串长度,这样就避免了越界的情况,思路更加明确,但同时时间复杂度就相应的上升了. 先计算所有字符串在同一列上的字符是否相同,然后依次向后延伸. 代码 ...

  7. 洛谷$P$2048 超级钢琴 $[NOI2010]$ $rmq$/主席树

    正解:$rmq$/主席树 解题报告: 传送门! 好像看过这题挺多次辣,,,$QwQ$ 之前$NOIp$的时候$cjk$学长讲课讲了这题(虽然那时候的$gql$太菜辣并麻油落实这道_(:з」∠)_,然后 ...

  8. Spring的BeanPostProcessor后置处理器与bean的生命周期

    前言 本文将把Spring在Bean的生命周期中涉及到的后置处理器一一梳理出来,并简要说一下功能,至于每个后置处理器在实际扩展中的用处,还要后续慢慢探索总结. 正文 下面一步步跟进探寻那些后置处理器们 ...

  9. SpringBoot 2.X集成 jdbc自动配置原理探究

    前言 Springboot对于数据访问层,不管是 SQL还是 NOSQL,Spring Boot 底层都是采用 Spring Data 的方式统一处理.Spring Data 是 Spring 家族中 ...

  10. django 数据库连接出现的问题

    mysqlclient 1.3.3 or newer is required; you have 0.7.11: 解决方法: 将报错文件中的如下代码注释: if version < (1, 3, ...