一、抽象工厂模式
抽象工厂模式是一种创建型模式。它提供了一个超级工厂,超级工厂可以衍生出一系列其它工厂,这些工厂提供接口来创建产品对象。
二、实例
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();
}
输出结果
我是牛排
我是牛腩
我是鸡排
我是鸡腿
三、优缺点
- 分离了具体的类。
- 易于交换产品系列。
- 利于产品的一致性。
- 难以支持新种类的产品。