设计模式-工厂模式

工厂模式,核心思路是将对象的实例化操作封装在一个工厂类,所有的对象都必须由这个“工厂”生产,巧妙地避免了满大街地出现new xxx()这种代码。

工厂模式有三种:简单工厂模式、方法工厂模式、抽象工厂模式。

简单工厂模式:

这里写图片描述

__interface  IFruite
{
public:   
    virtual void Show()=0;
};

class CApple :public IFruite
{
public:   
    virtual void Show() { cout << "I'm an Apple" << endl; }
};

class CPear :public IFruite
{
public:   
    virtual void Show() { cout << "I'm a Pear" << endl; }
};

class CWatermelon :public IFruite
{
public: 
    virtual void Show() { cout << "I'm a Watermelon" << endl; }
};


class CFruitFactory
{

public:
    enum Fruite_Type
    {
        FRUITE_APPLE,
        FRUITE_PEAR,
        FRUITE_WATERMELON
    };
public:
    static IFruite*  CreateFruite(Fruite_Type eType)
    {
        IFruite* pFruite = NULL;
        switch (eType)
        {
        case FRUITE_APPLE:
            pFruite = new CApple();
            break;
        case FRUITE_PEAR:
            pFruite = new CPear();
            break;
        case FRUITE_WATERMELON:
            pFruite = new CWatermelon();
            break;
        default:
            break;
        }
        return pFruite;
    }
};

简单工厂模式的实现较为简单,只有一个水果工厂类,所有的水果生产过程都必须由这个水果工厂生产,工厂类内部用一个switch分支判断具体生产哪一种水果。

如果现在要增加一种水果,比如香蕉。除了增加一个香蕉类,还得必须修改工厂类,这就违背了开放封闭原则

开放-封闭原则: 软件实体(类、模板、函数等等)可以扩展,但是不可以修改

方法工厂模式:

这里写图片描述

__interface  IFruite
{
public:   
    virtual void Show()=0;
};

class CApple :public IFruite
{
public:   
    virtual void Show() { cout << "I'm an Apple" << endl; }
};

class CPear :public IFruite
{
public:   
    virtual void Show() { cout << "I'm a Pear" << endl; }
};

class CWatermelon :public IFruite
{
public: 
    virtual void Show() { cout << "I'm a Watermelon" << endl; }
};



__interface IFactory
{
public: 
    virtual  IFruite* CreateFruite() = 0;
}; 

class CAppleFactory :public IFactory
{
public: 
    virtual IFruite* CreateFruite(){    return new CApple();}
};


class CPearFactory :public IFactory
{
public: 
    virtual IFruite* CreateFruite(){    return new CPear();}
};


class CWatermelonFactory :public IFactory
{
public: 
    virtual IFruite* CreateFruite(){    return new CWatermelon();   }
};

方法工厂模式符合开放-封闭原则:如果再增加一个香蕉类型,则需要增加一个香蕉类,和一个香蕉工厂类,而不需要修改任何类或函数。

但是,方法工厂模式为每一种水果都定义了一个工厂类,相比于简单工厂模式,工厂方法模式更容易造成类的泛滥。

最后,附上完整代码:
http://pan.baidu.com/s/1skBqnSx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值