关闭

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

标签: 工厂模式设计模式
271人阅读 评论(0) 收藏 举报
分类:

最近在工作中,有这样一种情况:对数据进行加密,使用了不同的加密算法,但是加密算法种类固定,不同的初始条件,使用不同的加密算法。对这刚开始还不熟悉,后来才知道设计模式中有对应的处理方法,于是记录下来,供自己和大家参考。
此处,应该根据不同初始条件实例化不同的加密算法,于是可以想到简单工厂模式。
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;
}

工厂方法模式,定义一个工厂基类,派生出具体的工厂,去生产具体的产品。此外,符合开放-封闭原则,增加新的加密算法,写加密功能类,还有派生工厂类即可,而不是修改工厂类。
这就是我对工厂方法模式的一些,目前还太菜,可能理解有误,如有错误之处,请私信我改正。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:19822次
    • 积分:516
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条