设计模式——工厂方法模式
来源:互联网 发布:监控干扰器软件 编辑:程序博客网 时间:2024/06/09 22:55
设计模式——工厂方法模式
阅读本文需要先阅读 简单工厂模式
今天我们依然通过运算器来讲解工厂方法模式。
首先,回顾一下简单工厂模式的几个步骤。
- 将运算类进行抽象,提取公共部分与接口。
- 工厂类掌握各个具体运算类,通过参数产生各种运算实例。
假如理解了简单工厂,那么工厂方法模式就比较简单了,它实际上就是将工厂也进行了抽象,提取了工厂类的接口。具体如下
class IFactory//抽象的工厂接口{ public Operator CreateOperator();};class PlusFactory:public IFactory//具体的工厂类{ public Operator CreateOperator() { return PlusOperator(); }};class SubtractFactory:public IFactory//具体的工厂类{ public Operator CreateOperator() { return SubtractOperator(); }};class MultiplicationFactory:public IFactory//具体的工厂类{ public Operator CreateOperator() { return MultiplicationOperator(); }};class DivisionFactory:public IFactory//具体的工厂类{ public Operator CreateOperator() { return DivisionOperator(); }};void main(){ IFactory *plusFac = new PlusFactory(); //1 Operator *opera = plusFac->CreateOperator(); //2 opera->numA = 1; opera->numB = 1; cout<<opera->GetResult()<<endl;}
还记得简单工厂的缺点吧:违背了对修改封闭,对扩张开放的原则。而在工厂方法这种方法里面,当我们需要增加一种运算方式的时候,只需要添加一个新的运算类,添加一个新的工厂方法,修改上述客户端中1,2部分。
但是比起简单工厂,这实际上又把逻辑的判断又重新搬回了客户端,所以,我们还需要对上述的代码进行修改。那工厂方法的优势何在呢?看下面的代码
void main(){ //1 Operator *plus1_1 = OperationFactory::CreateOperator(Plus); Operator *plus1_2 = OperationFactory::CreateOperator(Plus); ... Operator *plus1_N = OperationFactory::CreateOperator(Plus); //2 IFactory *factory = new PlusFactory(); Operator *plus2_1 = factory->CreateOperator(); Operator *plus2_2 = factory->CreateOperator(); ... Operator *plus2_N = factory->CreateOperator();}
第一部分使用了简单工厂的方法实现了加法,第二部分使用了工厂方法模式实现了加法。那么,假如我们需要将所有的运算操纵修改为减法,简单工厂需要修改多少行代码呢,答案是N。上面那些重复的代码都需要修改。假如是工厂方法模式需要修改多少行代码呢,答案是1。
//IFactory *factory = new PlusFactory();IFactory *factory = new SubtractFactory();
怎么样?是不是很神奇,我也觉得很神奇,所以跟大家分享一下。
总结
- 工厂方法模式将简单工厂的接口抽象出来,组成一个接口类
- 将简单工厂的大工厂拆分为了一个个小工厂,每个具体的小工厂实现自己的接口
- 比起简单工厂,遵守了面对对象设计的”对扩展开放,对修改封闭“的原则
- 缺点:客户端又需要自己进行逻辑判断,自己判断使用哪个工厂类。
0 0
- 设计模式—工厂方法
- 设计模式—工厂方法
- 设计模式——抽象工厂模式、工厂方法模式
- Java设计模式—工厂方法模式&抽象工厂模式
- Java设计模式—工厂方法模式&抽象工厂模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- 设计模式——工厂方法模式
- jQuery插件jQuery Validation学习(三)——validator对象
- 质数筛选(详细解释以及模板)(Eratosthenes)
- 【Leetcode】Two Sum II #Too easy, just review hashmap
- cocos2d-x 创建精灵的五种方法
- Hdu 2024C语言合法标识符
- 设计模式——工厂方法模式
- Redis 源码分析 (一)Redis竟然用 C 语言进行面向对象编程
- Android Tip : Android 获取当前Activity对象的方式:
- 身份证号码编码方法及校验算法
- 【高斯消元】[SGU275]To xor or not to xor
- ubuntu需要额外安装的包用于支持android sdk的运行
- Git使用教程
- PHP文件上传
- [Node入门] => 读书笔记(二)