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

原创 2016年08月28日 21:19:00

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式【工厂方法模式】

本文主要是分享自己在学习设计模式过程中的心得与记录,有什么不当之处,望各位有心关注的看官,给予指证与说明。本文主要讲述【工厂方法模式】,望各位细细品读。【转载使用,请注明出处:http://blog....
  • ma_hoking
  • ma_hoking
  • 2014年09月23日 22:34
  • 1205

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一...
  • jason0539
  • jason0539
  • 2014年04月07日 17:36
  • 221942

工厂方法及其设计原则

一、第一个设计模式原则:按接口编程 Interface IAlpha 接口名 Class Alpha 实现接口 Variable useAlpha 实例化新的Alpha 第二个设计模式原则:优...
  • qq_31159377
  • qq_31159377
  • 2015年10月27日 16:52
  • 972

【设计模式】简单工厂模式与工厂方法模式详细解读

1.前言     设计模式,各具特色,今天在此总结一下常见模式中 简单工厂模式与工厂方法模式的区别与联系 2.两种模式概要    1. 简单工厂模式         对于简单工厂模式的介绍,请...
  • yudandan10
  • yudandan10
  • 2013年03月10日 15:09
  • 4711

Spring中的设计模式--工厂方法模式

关于工厂模式的误会这是个老生常谈的问题,很多新手或者不太在意设计模式的同事会对工厂模式有极深的误解,总会把“工厂模式”与“静态工厂方法”混为一谈,什么是静态工厂方法呢?可以看一个非常简单的例子:pub...
  • zstu_cc
  • zstu_cc
  • 2017年01月02日 19:40
  • 3848

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...
  • qq_25827845
  • qq_25827845
  • 2016年09月11日 15:07
  • 4208

设计模式(一) 工厂模式 五种写法总结

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】系列开篇瞎BB设计模式相关的文章学习与总结,一...
  • zxt0601
  • zxt0601
  • 2016年10月12日 16:47
  • 10187

使用Object-C实现23种设计模式之工厂方法模式

23种设计模式的OC实现,23种设计模式之工厂方法模式。
  • u013054715
  • u013054715
  • 2016年05月19日 11:50
  • 4514

C#设计模式01-工厂方法模式(附源码)

在简单工厂模式中,工厂类负责创建所有产品的实例,这导致工厂类的职责太重,并且一旦工厂类无法正常工作,整个系统将会受到极大的影响,而且简单工厂模式并不能很好的符合开闭原则。为了解决简单工厂模式的这些缺点...
  • bhdxmaomi
  • bhdxmaomi
  • 2016年01月11日 12:18
  • 630

工厂方法模式(Factory Method)-最易懂的设计模式解析

前言在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭...
  • carson_ho
  • carson_ho
  • 2016年08月28日 08:31
  • 2874
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:神奇的设计模式之工厂方法模式
举报原因:
原因补充:

(最多只允许输入30个字)