设计模式-工厂方法模式
2016-06-21 20:32
204 查看
工厂方法模式:
我对这个的理解是,简单工厂的工厂是生产对象,而工厂方法模式的工厂是生产工厂对象,然后被生产的工厂对象再去生产产品对象,也就是把对象的创建延迟到了工厂创建的工厂里。要理解这个模式就要对比着去看简单工厂,还有就是书上对这个例子描述的不是很透彻,用的例子没说明性,也没过多的阐述这个模式的特点,也就是书上说的不是很透,我看了书然后又在网上查了一些资料,现在我还是用例子说明(我之前的总结有问题,这次重新总结)。
还是来分析加减乘除的那个问题,简单工厂方法是把算法抽象出来,然后通过工厂直接生产算法类实体,然后客户端得到这个类直接调用。看上去还比较简单,但是问题是不满足OCP啊,就是那个工厂里面的那个Switch(),为了解决掉这个问题,工厂方法是在工厂的地方继续抽象,当新增加一个算法的时候,直接增加一个继承类就行了。这样满足OCP,方便扩展。
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。而工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单的工厂的内部逻辑哦判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的么人现在是修改客户端!。但是最大的优点就是扩展的时候可以满足OCP了。
工厂方法模式实现加减乘除:
客户端调用:
我对这个的理解是,简单工厂的工厂是生产对象,而工厂方法模式的工厂是生产工厂对象,然后被生产的工厂对象再去生产产品对象,也就是把对象的创建延迟到了工厂创建的工厂里。要理解这个模式就要对比着去看简单工厂,还有就是书上对这个例子描述的不是很透彻,用的例子没说明性,也没过多的阐述这个模式的特点,也就是书上说的不是很透,我看了书然后又在网上查了一些资料,现在我还是用例子说明(我之前的总结有问题,这次重新总结)。
还是来分析加减乘除的那个问题,简单工厂方法是把算法抽象出来,然后通过工厂直接生产算法类实体,然后客户端得到这个类直接调用。看上去还比较简单,但是问题是不满足OCP啊,就是那个工厂里面的那个Switch(),为了解决掉这个问题,工厂方法是在工厂的地方继续抽象,当新增加一个算法的时候,直接增加一个继承类就行了。这样满足OCP,方便扩展。
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。而工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单的工厂的内部逻辑哦判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的么人现在是修改客户端!。但是最大的优点就是扩展的时候可以满足OCP了。
工厂方法模式实现加减乘除:
#pragma once //抽象算法接口 class CInterfaceAlgorithm { public: virtual bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns) = 0; }; class CAddition : public CInterfaceAlgorithm { public: bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns) { nNumberAns = nNumberA + nNumberB; return true; } }; class CSubtraction : public CInterfaceAlgorithm { public: bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns) { nNumberAns = nNumberA - nNumberB; return true; } }; class CMultiplication : public CInterfaceAlgorithm { public: bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns) { nNumberAns = nNumberA * nNumberB; return true; } }; class CDivision : public CInterfaceAlgorithm { public: bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns) { if(!nNumberB) { return false; } nNumberAns = nNumberA / nNumberB; return true; } }; //工厂接口 class CInterfaceFactory { public: virtual CInterfaceAlgorithm * GetFactoryBody() = 0; }; class CAdditionFactory : public CInterfaceFactory { public: CInterfaceAlgorithm * GetFactoryBody() { return new CAddition(); } }; class CSubtractionFactory : public CInterfaceFactory { public: CInterfaceAlgorithm * GetFactoryBody() { return new CSubtraction(); } }; class CMultiplicationFactory : public CInterfaceFactory { public: CInterfaceAlgorithm * GetFactoryBody() { return new CMultiplication(); } }; class CDivisionFactory : public CInterfaceFactory { public: CInterfaceAlgorithm * GetFactoryBody() { return new CDivision(); } };
客户端调用:
#include "stdafx.h" #include "FactoryMode.h" #include <iostream> using namespace std; int main() { CInterfaceAlgorithm *pHashMemoryAlgorithm[10] = {0}; CInterfaceFactory *pHashMemoryFactory[10] = {0}; int nAlgorithmId = -1 ,nFactoryId = -1 ,nAns; pHashMemoryFactory[++nFactoryId] = new CAdditionFactory(); pHashMemoryAlgorithm[++nAlgorithmId] = pHashMemoryFactory[nFactoryId]->GetFactoryBody(); pHashMemoryFactory[++nFactoryId] = new CSubtractionFactory(); pHashMemoryAlgorithm[++nAlgorithmId] = pHashMemoryFactory[nFactoryId]->GetFactoryBody(); pHashMemoryFactory[++nFactoryId] = new CMultiplicationFactory(); pHashMemoryAlgorithm[++nAlgorithmId] = pHashMemoryFactory[nFactoryId]->GetFactoryBody(); pHashMemoryFactory[++nFactoryId] = new CDivisionFactory(); pHashMemoryAlgorithm[++nAlgorithmId] = pHashMemoryFactory[nFactoryId]->GetFactoryBody(); for(int i = 0 ;i <= nAlgorithmId ;i ++) { if( pHashMemoryAlgorithm[i]!= NULL && pHashMemoryAlgorithm[i]->GetValue(1 ,5 ,nAns)) { cout<<nAns<<endl; } else { cout<<"Error"<<endl; } } for(int i = 0 ;i <= nAlgorithmId ;i ++) { delete pHashMemoryAlgorithm[i]; delete pHashMemoryFactory[i]; } return 0; }
相关文章推荐
- Android USB Carmerea
- iOS开发-FFmpeg深入分析
- 软件管理
- shell基本类型和参数传递
- 【剑指offer】二叉树的镜像(递归+非递归)
- weak修饰符
- PHP学习过程中遇到的疑难杂症
- iOS开发-FFmpeg深入分析
- remote: ERROR: missing Change-Id in commit message footer
- 《PCL点云库学习&VS2010(X64)》Part 10 PCL1.72(VTK6.2.0)选点操作
- LeetCode 283. Move Zeroes
- 组件底部添加阴影
- shape的使用
- div布局
- js常见坑
- HDU 2892 (平面几何 圆和多边形面积交)
- 创建Widget窗口控件
- sqli_lab
- 48. spring boot单元测试restfull API【从零开始学Spring Boot】
- code1074 食物链