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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值