您的位置:首页 > 其它

神奇的设计模式之工厂方法模式

2016-08-28 21:19 295 查看
最近在工作中,有这样一种情况:对数据进行加密,使用了不同的加密算法,但是加密算法种类固定,不同的初始条件,使用不同的加密算法。对这刚开始还不熟悉,后来才知道设计模式中有对应的处理方法,于是记录下来,供自己和大家参考。

此处,应该根据不同初始条件实例化不同的加密算法,于是可以想到简单工厂模式。

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;
}


工厂方法模式,定义一个工厂基类,派生出具体的工厂,去生产具体的产品。此外,符合开放-封闭原则,增加新的加密算法,写加密功能类,还有派生工厂类即可,而不是修改工厂类。

这就是我对工厂方法模式的一些,目前还太菜,可能理解有误,如有错误之处,请私信我改正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息