设计模式(二 & 三)工厂模式:2-工厂方法模式
- 模拟场景:
沿用 设计模式(二)工厂模式:1-简单工厂模式 中关于运算器 Operation 的例子。
- 思想:
针对在 Easy Factory 中提出的,破坏“开-闭原则”的问题,Factory Method 提出了另一种解决方案:
将生产运算器的工厂抽象出来(AbsOperationFactory),然后为原来每一个需要创建的对象(extends AbsOperation),都建立一个专门的工厂。
这样一来,可以巧妙地利用多态的性质,完成对代码的解耦。
- 工厂方法模式的组成结构:
- 抽象工厂(Abstract Factory)
- 具体工厂(Concrete Factory)
- 抽象产品(Abstract Product)
- 具体产品(Concrete Product)
- UML:

- UML 分析:
这是一个简化版的 Operation UML 类图。
具体工厂 OperationAddFactory 通过 Override 父类的 createOperation() 方法,将返回类型由抽象产品 AbsOperation 缩小为具体产品 OperationAdd。
- 代码:
public abstract class AbsOperation {
protected abstract BigDecimal calc(double a, double b);
}
public abstract class AbsOperationFactory {
protected abstract AbsOperation createOperation();
}
public final class OperationAdd extends AbsOperation {
OperationAdd() {
}
@Override
public BigDecimal calc(double a, double b) {
return new BigDecimal(a).add(new BigDecimal(b));
}
}
public final class OperationAddFactory extends AbsOperationFactory {
public OperationAdd createOperation() {
return new OperationAdd();
}
}
- 优势:
遵循了“开闭原则”。
由调用方决定具体需要哪一个 Operation。
- 劣势:
针对每一种产品,都需要多创建一个工厂对象。
- 和 简单工厂模式 中的反射形式比较:
更多的内存开销。
但是使用 new 关键字来创建对象,相比使用反射创建对象,更快,也更加安全(反射对于创建复杂对象不具备普适性),也容易在编译期间发现错误。
设计模式(二 & 三)工厂模式:2-工厂方法模式的更多相关文章
- 悟空模式-java-工厂方法模式
[却说那七衣仙女自受了大圣的定身法术,一周天方能解脱,各提花篮,回奏王母说道:“齐天大圣使术法困住我等,故此来迟.”王母问道:“汝等摘了多少蟠桃?”仙女道:“只有两篮小桃,三篮中桃.至后面,大桃半个也 ...
- 设计模式(三): FACTORY工厂模式 -- 创建型模式
1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类. 2.适用场景 1.第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体 ...
- [设计模式]第三回:抽象工厂模式(Abstract Factory)
概述 在系统中往往会有这种需求,客户端会用到很多对象,而且根据需求变化很可能会切换成另外一套对象.抽象工厂模式可以提供一种封装机制来面对这种需求. 实践 物理模型: 皮肤主题:设计一个可以切换皮肤主题 ...
- js原生设计模式——4安全的工厂方法模式之Factory方法模式
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 【C#设计模式——创建型模式】工场方法模式
工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子 ...
- PHP设计模式(三):抽象工厂模式
- :工厂模式1:方法模式--Pizza
#ifndef __PIZZA_H__ #define __PIZZA_H__ class Pizza { public: Pizza(){} virtual ~Pizza(){} virtual c ...
- Spring入门学习(二)三种实例化bean的方法
前面的哪一种就是通过构造函数来实例化对象 下面我们可能用到工厂方法来视力话对象,这样我们的配置文件又该怎么配置呢 <bean name="service2" class=&q ...
- 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)
回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回 日志记录组件之自主的Vlog>和<第三回 日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...
- 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)
. 实例介绍 在本例中,我们使用一个常见的场景,我们每个人都上了很多年学,中学大学硕士,有的人天生就是个天才,中学毕业就会微积分,因此得了诺贝尔数学奖:也有的人在大学里学了很多东西,过得很充实很满意 ...
随机推荐
- Unity3D中使用Projector生成阴影
在Unity3D中使用Projector实现动态阴影 无意中看见一篇博客叙述使用Projector实现动态阴影可以在移动平台拥有非常好的性能,遂按照其想法实现了一遍,发现其中竟有许多细节,写下这篇博客 ...
- Maven settings.xml配置详解
首先:Maven中央仓库的搜索全部公共jar包的地址是,http://search.maven.org/ ===Maven基础-默认中央仓库============================== ...
- Centos7.3 安装devstack stein版本
1. 系统准备 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0 sed -i ...
- mongodb 导入导出
F:\Mongodb\bin>mongoexport.exe -h localhost:27017 -d proxy_db -c proxy_tb -o f:/p1.json 导出 -h 服务器 ...
- ovs的学习
本来编辑好了的, 结果忘了保存, 坑爹,直接把人家的网址贴上来吧 http://blog.chinaunix.net/uid-20737871-id-4333314.html 昨天遇到一个问题(虚拟机 ...
- Git基本操作笔记:初始化,用户设置,撤销修改
1. Git 初始化 git init git remote add repos_name repos_url git add . git commit -m 'commit message' gi ...
- matplot绘图(五)
b3D图形绘制 # 导包:from mpl_toolkits.mplot3d.axes3d import Axes3Dimport matplotlib.pyplot as plt%matplotli ...
- centos7无法切换startx
centos光盘安装后,显示命令行模式,通过startx无法进入图形界面? 解决方法:1.使用yum grouplist查看,根据显示的结果采用不同的界面格式,我用的是 yum groupinstal ...
- yagmail 邮箱的使用
文章来源:GITHub:https://github.com/kootenpv/yagmail 安装 pip3 install yagmail pip3 install keyring 简单例子 im ...
- Applied Nonparametric Statistics-lec3
Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/4 使用非参数方法的优势: 1. 对总体分布做的假设 ...