工厂模式(Factory)-设计模式(一)

作用:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method 使一个类的实例化延迟到其子类。
工厂模式可分为三类,简单工厂模式、工厂方法模式、抽象工厂模式;在本节,我们来讨论一下简单工厂模式和工厂方法模式。

简单工厂模式:
举个简单的例子:
肯德基可以出售两种不同风味的鸡腿,具体卖哪一种呢?由客户决定该给客户卖哪一种。下面给出一个简单的实现用例。

#include<iostream>

using namespace std;

enum CTYPE {COREA, COREB};     
class Chicken    
{    
public:    
    virtual void Show() = 0;  
};    
//麻辣味鸡腿   
class ChickenA: public Chicken    
{    
public:    
    void Show() { cout<<"鸡腿,麻辣"<<endl; }    
};    
//芝士味鸡腿    
class ChickenB: public Chicken    
{    
public:    
    void Show() { cout<<"鸡腿,芝士"<<endl; }    
};    
//肯德基呢,可以卖两种鸡腿   
class Factory    
{    
public:     
    Chicken* CreateChicken(enum CTYPE ctype)    
    {    
        if(ctype == COREA) //工厂内部判断    
            return new ChickenA(); //卖麻辣味鸡腿    
        else if(ctype == COREB)    
            return new ChickenB(); //卖芝士味鸡腿    
        else    
            return NULL;    
    }    
}; 
int main()
{
    Factory *m_pFactotry;
    m_pFactotry->CreateChicken(COREA)->Show();
    delete m_pFactotry;
    return 0;
}

这就是简单的工厂模式,突然有一天,有个吃货给肯德基提议增加黑椒味的鸡腿,这下可难住肯德基了,因为如果我增加的话,我就要改变我自己呀。这不就违反了开放、封闭原则了吗?
于是,工厂方法模式就出现了。
还是以鸡腿为例说明问题吧,毕竟作为一个吃货,吃才是本职。
哎吆,肯德基经过卖鸡腿赚了钱了,这是肯德基就要考虑考虑了。为了顾客分流,肯德基用了洪荒之力开辟两个柜台,一个来卖麻辣味的鸡腿,另一个了卖芝士味鸡腿。这样想吃什么风味的鸡腿就直接去对应的柜台了嘛。

#include<iostream>
using namespace std;    
class Chicken    
{    
    public:    
        virtual void Show() = 0;  
};    
//麻辣味鸡腿   
class ChickenA: public Chicken    
{    
    public:    
        void Show() { cout<<"鸡腿,麻辣"<<endl; }    
};    
//芝士味鸡腿    
class ChickenB: public Chicken    
{    
    public:    
        void Show() { cout<<"鸡腿,芝士"<<endl; }    
};      
//肯德基  
class Factory    
{    
    public:     
         virtual Chicken* CreateChicken()= 0; 
};
//柜台A,专卖麻辣鸡腿 
class FactoryA: public Factory
{
    public:
        ChickenA * CreateChicken()
        {
            return new ChickenA;
        }   
};
//柜台B,专卖芝士鸡腿 
class FactoryB: public Factory
{
    public:
        ChickenB * CreateChicken()
        {
            return  new ChickenB;
        }
};
int main()
{
    Factory *p = new FactoryB();
    p->CreateChicken()->Show();

    Factory *q = new FactoryA();
    q->CreateChicken()->Show();
    delete q;
    delete p;
    return 0;
}

当然这样做的结果是,肯德基只要每增加一种口味的鸡腿就要新开辟一块柜台来卖这种口味的鸡腿,为了节约成本,啃得鸡提出了新方案来解决这个问题,就要引出后面的抽象工厂了。好的。抽象工厂模式我们下次来讨论,不见不散!
这是我自己理解的Factory模式。
这里写图片描述
这是网上找的UML图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值