设计模式学习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. 难以支持新种类的产品。

猜你喜欢

转载自blog.csdn.net/weixin_45001971/article/details/113100058