设计模式(Java语言)- 工厂方法模式
前言
在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(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语言)- 工厂方法模式的更多相关文章
- 重学 Java 设计模式:实战工厂方法模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- java设计模式-----2、工厂方法模式
再看工厂方法模式之前先看看简单工厂模式 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的 ...
- Java设计模式3:工厂方法模式
工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...
- Java描述设计模式(03):工厂方法模式
本文源码:GitHub·点这里 || GitEE·点这里 一.工厂方法模式 1.生活场景 系统常见的数据导出功能:数据导出PDF.WORD等常见格式. 2.工厂方法模式 是类的创建模式,又叫做虚拟构造 ...
- 《JAVA设计模式》之工厂方法模式 (Factory)
在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
- 大话设计模式C++版——工厂方法模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
- C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...
- 设计模式C++实现——工厂方法模式
模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...
随机推荐
- 深入理解Jvm--Java静态分配和动态分配完全解析
jvm中分配Dispatch的概念 分派是针对方法而言的,指的是方法确定的过程,通常发生在方法调用的过程中.分派根据方法选择的发生时机可以分为静态分派和动态分派,其中对于动态分派,根据宗量种数又可以分 ...
- Linux 内核 PCI 总线
任何在 PCI 总线上的设备有参数 name 和 SUBSYSTEM 环境变量设置为值 pci. PCI 子系 统也一直添加下面 4 个环境变量: PCI_CLASS 设备的 PCI 类号, 16 进 ...
- GetDc函数与GetWindowDC函数的区别
GetDc函数:用于获得hWnd参数所指定窗口的客户区域的一个设备环境 GetWindowDC函数:返回hWnd参数所指定的窗口的设备环境. 获得的设备环境覆盖了整个窗口(包括非客户区),例如标题栏. ...
- Vue的数据双向绑定和Object.defineProperty()
Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那 ...
- apache WEB服务器安装(包括虚拟主机)
一.apache下载编译安装 yum install apr apr-devel apr-util apr-util-devel gcc-c++ wget tar -y cd /usr/src wge ...
- LabWindows/CVI基础
1.LabWindows/CVI了解 提到NI公司,大家可能最先联想到的是NI公司推出的LabVIEW软件.LabWindows/CVI与LabVIEW相比,主要应用在各种测试.控制.故障分析及信息处 ...
- 一键自动生成 java junit 测试代码神器 gen-test-plugin 入门介绍
gen-test-plugin 我们日常编写代码的过程中,经常需要为代码编写测试案例. 随着对代码质量的要求越来越高,很多公司开始通过代码的测试覆盖率作为 QA 的一个评定指标. 本框架可以一键生成所 ...
- springboot前后端分离项目redis做验证码及用户信息存储验证长时间不操作失效问题解决
1.错误回显:Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: MISCO ...
- 使用Miniconda安装Scrapy遇到的坑
最近在看小甲鱼的书,学习学习爬虫,其中有一块是通过Miniconda3安装Scrapy,结果却遇到了下面的错误:fatal error in launcher:unable to create pro ...
- $POJ$2976 $Dropping\ tests$ 01分数规划+贪心
正解:01分数规划 解题报告: 传送门! 板子题鸭,,, 显然考虑变成$a[i]-mid\cdot b[i]$,显然无脑贪心下得选出最大的$k$个然后判断是否大于0就好(,,,这么弱智真的算贪心嘛$T ...