设计模式-工厂方法模式

        在上一节中,我们介绍了简单工厂模式,该模式的特点是我们可以指定工厂去创建什么类型的鞋子类,因为该工厂已经继承了创建所有鞋子类的方法了。但是简单工厂模式的可扩展性较差,一旦我们有新的类型的鞋子需要生产了的话,我们就需要修改工厂类。为了减少对工厂类的修改,提出了工厂方法模式:对每种鞋子都分配一个工厂类,也就是说每个工厂类都只负责生产一类鞋子。这样,一旦有了新种类的鞋子需要生产的时候,我们可以再扩展一个鞋子工厂去负责生产这类鞋子。所以,工厂方法模式又称之为流水线模式。

        如上图所示,一共需要四种类:抽象产品类、具体产品类、抽象工厂类、具体工厂类。

1. 抽象类

        在抽象类中一共包括抽象产品类以及抽象工厂类两种,其中抽象产品类是对鞋子类的属性以及方法的抽象,而抽象工厂类是对工厂类的属性已经方法的抽象。

class Shoes{
public:
    Shoes(){};
    virtual ~Shoes(){};
    virtual void show() = 0;
};

class Factory{
public:
    Factory(){};
    virtual ~Factory(){};
    virtual Shoes* produce() = 0;
};

2. 具体产品类

        在具体产品中主要包括Nike鞋子以及LiNing鞋子类的实现:

class Nike: public Shoes{
public:
    Nike(){};
    ~Nike(){};
    void show(){
        cout << "这是Nike鞋子" << endl;
    };
};

class LiNing: public Shoes{
public:
    LiNing(){};
    ~LiNing(){};
    void show(){
        cout << "这是LiNing鞋子" << endl;
    };
};

3. 具体工厂类

        在具体工厂类中,每个工厂类都负责生产一种类别的鞋子:

class NikeFactory: public Factory{
public:
    NikeFactory(){};
    ~NikeFactory(){};
    Nike* produce(){
        cout << "这是NikeFactory工厂" <<endl;
        return new Nike();
    };
};
class LiNingFactory: public Factory{
public:
    LiNingFactory(){};
    ~LiNingFactory(){};
    LiNing* produce(){
        cout << "这是LiNingFactory工厂" << endl;
        return new LiNing();
    }
};

4. 主函数测试

        在主函数中,我们需要创建两类鞋子工厂的对象指针,然后再生产鞋子:

int main(){
    NikeFactory* nike = new NikeFactory(); 
    LiNingFactory* liNing = new LiNingFactory();
    // 使用两条生产线生产nike产品和lining产品
    nike->produce()->show();
    liNing->produce()->show();
    return 0;
}

        将上述所有代码都放在一个文件下执行,下面就是对上述代码的运行结果:

 

5. 小结

        工厂方法类(流水线方法类)增加了简单工厂模式的可扩展性,但是该类模式依然存在一定的不如,比如每个工厂类只能够生产鞋子这样一个产品,如果Nike公司需要发售相关的衣服的时候,工厂方法类就无能为力了。因此,为了让工厂类能够集成多种产品,又提出了抽象工厂模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值