设计模式学习1:抽象工厂模式

一、抽象工厂模式

抽象工厂模式是一种创建型模式。它提供了一个超级工厂,超级工厂可以衍生出一系列其它工厂,这些工厂提供接口来创建产品对象。

二、实例

1.定义工厂基类

class MeatFactory {	 //肉工厂基类
public:
    MeatFactory() {}
    virtual Beef *produceBeef(string name) = 0;
    virtual Chicken *produceChicken(string name) = 0;
};

2.定义产品基类

class Beef {		//牛肉
public:
    Beef() {}
    virtual void beefInfo() = 0;
};

class Chicken {		//鸡肉
public:
    Chicken() {}
    virtual void chickenInfo() = 0;
};

3.实现产品类

class BeefSteak : public Beef {
public:
    BeefSteak() : Beef() {}
    void beefInfo() {
        cout << "我是牛排" << endl;
    }
};

class BeefFlank : public Beef {
public:
    BeefFlank() : Beef() {}
    void beefInfo() {
        cout << "我是牛腩" << endl;
    }
};

class ChickenSteak : public Chicken {
public:
    ChickenSteak() : Chicken() {}
    void chickenInfo() {
        cout << "我是鸡排" << endl;
    }
};

class ChickenLeg : public Chicken {
public:
    ChickenLeg() : Chicken() {}
    void chickenInfo() {
        cout << "我是鸡腿" << endl;
    }
};

4.实现工厂类

class BeefFactory : public MeatFactory {	//牛肉工厂
public:
    BeefFactory() : MeatFactory() {}
    Beef *produceBeef(string name) {
        if(name == "steak")
            return new BeefSteak();
        else if(name == "flank")
            return new BeefFlank();
        else
            return NULL;
    }

    Chicken *produceChicken(string name) {return NULL;}
};

class ChickenFactory : public MeatFactory { //鸡肉工厂
public:
    ChickenFactory() : MeatFactory() {}
    Beef *produceBeef(string name) {return NULL;}

    Chi22cken *produceChicken(string name) {
        if(name == "steak")
            return new ChickenSteak();
        else if(name == "leg")
            return new ChickenLeg();
        else
            return NULL;
    }
};

5.使用

void test() {
    BeefFactory beefFactory;
    Beef *beef = beefFactory.produceBeef("steak");
    if(beef) beef->beefInfo();
    beef = beefFactory.produceBeef("flank");
    if(beef) beef->beefInfo();

    ChickenFactory chickenFactory;
    Chicken *chicken = chickenFactory.produceChicken("steak");
    if(chicken) chicken->chickenInfo();
    chicken = chickenFactory.produceChicken("leg");
    if(chicken) chicken->chickenInfo();
}

输出结果

我是牛排
我是牛腩
我是鸡排
我是鸡腿

三、优缺点

  1. 分离了具体的类。
  2. 易于交换产品系列。
  3. 利于产品的一致性。
  4. 难以支持新种类的产品。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值