神奇的设计模式之工厂方法模式
2016-08-28 21:19
295 查看
最近在工作中,有这样一种情况:对数据进行加密,使用了不同的加密算法,但是加密算法种类固定,不同的初始条件,使用不同的加密算法。对这刚开始还不熟悉,后来才知道设计模式中有对应的处理方法,于是记录下来,供自己和大家参考。
此处,应该根据不同初始条件实例化不同的加密算法,于是可以想到简单工厂模式。
1.简单工厂模式
加密基类:可以派生出具体的加密类。
工厂类:工厂类中根据初始的条件,生成不同加密类的实例并返回基类指针[多态性嘛!不用多说了]。
工厂类依赖不同加密类,至于多出工厂类这个类,主要解除客户和具体的加密算法之间的依赖。
代码如下:
简单工厂就是这样,是不是很简单,哈哈。如果有新的加密算法添加进来,只需要在派生一个加密类,同时修改工厂里边的分支判断条件即可。而这,恰恰就是简单工厂的弊端,修改工厂类,违背了一个原则:开放封闭原则。
开放封闭原则
简单说就是对扩展开放,对修改封闭。
那为什么我还使用简单工厂模式,因为我的加密算法种类是确定,就是不考虑扩展了,于是我偷懒就用了简单工厂模式。假如考虑扩展性,我的重新改进了,就是二十三种设计模式中的——工厂方法模式。
2.工厂方法模式
简单工厂在工厂类中逻辑判断实例化哪一个加密类,能不能把这个内部逻辑判断,挪出来,在客户端进行判断。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。[程杰《大话设计模式》]
代码如下,仅修改了工厂类:
工厂方法模式,定义一个工厂基类,派生出具体的工厂,去生产具体的产品。此外,符合开放-封闭原则,增加新的加密算法,写加密功能类,还有派生工厂类即可,而不是修改工厂类。
这就是我对工厂方法模式的一些,目前还太菜,可能理解有误,如有错误之处,请私信我改正。
此处,应该根据不同初始条件实例化不同的加密算法,于是可以想到简单工厂模式。
1.简单工厂模式
加密基类:可以派生出具体的加密类。
工厂类:工厂类中根据初始的条件,生成不同加密类的实例并返回基类指针[多态性嘛!不用多说了]。
工厂类依赖不同加密类,至于多出工厂类这个类,主要解除客户和具体的加密算法之间的依赖。
代码如下:
//定义加密基类 class EncryptBase { public: EncryptBase() {} virtual void Print() {} virtual ~EncryptBase() {} }; class AESEncrypt :public EncryptBase { public: AESEncrypt() {} void Print() { std::cout << "This is aes!\n"; } virtual ~AESEncrypt() {} }; class DESEncrypt :public EncryptBase { public: DESEncrypt() {} void Print() { std::cout << "This is des!\n"; } virtual ~DESEncrypt() {} }; //工厂类,给定条件,实例化不同对象 class EncryptFactory { public: EncryptFactory() {} EncryptBase* createEncryptMethod(int iValue); virtual ~EncryptFactory() {} }; EncryptBase* EncryptFactory::createEncryptMethod(int iValue) { switch (iValue) { case 1: return new AESEncrypt(); break; case 2: return new DESEncrypt(); break; default: return NULL; break; } } int main() { EncryptFactory fac; EncryptBase* ebPtr = fac.createEncryptMethod(1); ebPtr->Print(); system("pause"); return 0; }
简单工厂就是这样,是不是很简单,哈哈。如果有新的加密算法添加进来,只需要在派生一个加密类,同时修改工厂里边的分支判断条件即可。而这,恰恰就是简单工厂的弊端,修改工厂类,违背了一个原则:开放封闭原则。
开放封闭原则
简单说就是对扩展开放,对修改封闭。
那为什么我还使用简单工厂模式,因为我的加密算法种类是确定,就是不考虑扩展了,于是我偷懒就用了简单工厂模式。假如考虑扩展性,我的重新改进了,就是二十三种设计模式中的——工厂方法模式。
2.工厂方法模式
简单工厂在工厂类中逻辑判断实例化哪一个加密类,能不能把这个内部逻辑判断,挪出来,在客户端进行判断。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。[程杰《大话设计模式》]
代码如下,仅修改了工厂类:
class EncryptFactoryBase { public: EncryptFactoryBase() {}; EncryptBase* createEncryptMethod() {}; virtual ~EncryptFactoryBase() {}; }; class AESEncryptFactory:public EncryptFactoryBase { public: AESEncryptFactory() {}; EncryptBase* createEncryptMethod() { return new AESEncrypt(); } virtual ~AESEncryptFactory() {}; }; class DESEncryptFactory :public EncryptFactoryBase { public: DESEncryptFactory() {}; EncryptBase* createEncryptMethod() { return new DESEncrypt(); } virtual ~DESEncryptFactory() {}; }; int main() { AESEncryptFactory aesFac; EncryptBase* ebPtr = aesFac.createEncryptMethod(); ebPtr->Print(); DESEncryptFactory desFac; EncryptBase* ebPtr1 = desFac.createEncryptMethod(); ebPtr1->Print(); system("pause"); return 0; }
工厂方法模式,定义一个工厂基类,派生出具体的工厂,去生产具体的产品。此外,符合开放-封闭原则,增加新的加密算法,写加密功能类,还有派生工厂类即可,而不是修改工厂类。
这就是我对工厂方法模式的一些,目前还太菜,可能理解有误,如有错误之处,请私信我改正。
相关文章推荐
- GoF 23个经典的设计模式03--创建模式之工厂方法(未完代续)
- 设计模式--工厂方法
- 设计模式(三)、FACTORY METHOD(工厂方法)---对象创建型模式
- 设计模式学习笔记四:工厂方法(Factory Method)
- 每周一个设计模式之工厂方法与抽象工厂
- 设计模式之Factory1(简单工厂,工厂方法,抽象工厂的比较)
- 设计模式之工厂方法
- 设计模式 之 工厂方法
- C# 设计模式 之 工厂方法
- 设计模式(1)工厂方法 感觉没必要用工厂方法
- 设计模式杂谈:创建型模式之工厂方法(Factory Method)
- 设计模式--创建模式--工厂方法
- 设计模式示例一 Factory Method(工厂方法)
- 设计模式--工厂方法
- JAVA设计模式——工厂方法(Factory Method)模式
- 第二个设计模式:工厂方法
- 设计模式示例一 Factory Method(工厂方法)
- 设计模式 之 工厂方法
- 我把Black_Cat与Walaqi等关于"设计模式"之"工厂方法""抽象工厂"的讨论整理如下,以方
- 设计模式之工厂方法(FACTORY METHOD))(二)