设计模式(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是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...
随机推荐
- vue element UI el-table 表格调整行高的处理方法
这是我在工作项目中遇到的问题,我想将标记处下方的表格高度调低一点,也就是想实现下面的这个效果: 代码调整如下: 说明: 缩小:行高到一定程度之后便不能缩小. 好像最小35px.各位可以试一下. 升高: ...
- Vue-route页面切换过渡动画
重点: 1.判断路由前进还是后退 2.切换时动画如何实现 1.需要给各个页面定义层级,切换路由时判断进入哪个层级页面,如果进入层级高页面做前进动画,否则做后退动画在路由定义中添加meta自定义参数 ...
- 2018-8-10-WPF-修改图片颜色
title author date CreateTime categories WPF 修改图片颜色 lindexi 2018-08-10 19:16:53 +0800 2018-07-03 15:4 ...
- 【Linux】grep笔记
Linux grep命令用于查找文件里符合条件的字符串. 参数: -a 或 --text : 不要忽略二进制的数据. -A<显示行数> 或 --after-context=<显示行数 ...
- docker 使用elasticsearch+logstash
1.1部署elasticsearch:6.5.4 docker pull elasticsearch:6.5.4 docker run -d --name elasticsearch -p 9200: ...
- 第二阶段:1.流程图:12.AXURE绘制页面流程图
注意的事项: 完整的页面流程图
- 第二阶段:1.流程图:10.visio绘制泳道图
选择跨智能 同时水平 设置好泳道图标题以及泳道名字 泳道位置可以拖拽更换 左侧有一些基本的形状 包括分隔符等等 添加分隔符并填上分隔符上面的阶段名称 左边选择形状界面 然后拖拽使用 同时可以用连接线链 ...
- 使用windows api函数捕获SAP session的左下角消息句柄
背景:SAP session的左下角消息非常有用,我们在做SAP的自动化脚本时可以设法读到这个消息的内容,作为程序后续动作的判断条件.如下图: 比如小爬之前给财务的同事制作了一个批量导出 ...
- 如何根据HttpServletRequets获取用户真实IP地址
最近的一个项目的某个功能获取用户的ip地址,添加用户的系统使用记录. 我发现当我直接使用getRemoteAddr()方法从HttpServletRequet中获取用户的ip时,获取到的是服务器的ip ...
- 基于Redis的分布式锁和Redlock算法
1 前言 前面写了4篇Redis底层实现和工程架构相关文章,感兴趣的读者可以回顾一下: Redis面试热点之底层实现篇-1 Redis面试热点之底层实现篇-2 Redis面试热点之工程架构篇-1 Re ...