[创建型] -- 抽象工厂模式
前面讲到工厂方法模式,其实工厂方法模式是抽象工厂模式的特例。工厂方法模式中每个工厂只生产一种产品,而在抽象工厂模式中每个工厂可以生产多种具体产品。
适用性:(适用性论述是复制过来的,本人不理解!初学)
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
已电视机实例,附上代码:
#include <iostream>
using namespace std;
// 抽象工厂模式
/*
*
*/
class TV // 电视机抽象类
{
public:
TV() {}
virtual ~TV() {}
virtual void play() = 0;
};
class HaierTV : public TV //海尔电视机类
{
public:
HaierTV() {}
virtual~HaierTV() {}
virtual void play()
{
cout << "海尔电视机播放中..." << endl;
}
};
class TCLTV : public TV //TCL电视机类
{
public:
TCLTV() {}
virtual ~TCLTV() {}
virtual void play()
{
cout << "TCL电视机播放中..." << endl;
}
};
class AirConditioner // 空调抽象类
{
public:
AirConditioner() {}
virtual ~AirConditioner() {}
virtual void changeTemperature() = 0;
};
class HaierConditioner : public AirConditioner // 海尔空调类
{
public:
HaierConditioner() {}
virtual ~HaierConditioner() {}
virtual void changeTemperature()
{
cout << "海尔空调温度改变中..." << endl;
}
};
class TCLConditioner : public AirConditioner // TCL空调类
{
public:
TCLConditioner() {}
virtual ~TCLConditioner() {}
virtual void changeTemperature()
{
cout << "TCL空调温度改变中..." << endl;
}
};
class AbstructFactory // 抽象工厂类
{
public:
AbstructFactory() {}
virtual ~AbstructFactory() {}
virtual TV * ProduceTV() = 0;
virtual AirConditioner * ProduceAirconditioner() = 0;
};
class HaierFactory : public AbstructFactory // 海尔工厂类
{
public:
HaierFactory() {}
virtual ~HaierFactory() {}
virtual TV * ProduceTV()
{
return new HaierTV();
}
virtual AirConditioner * ProduceAirconditioner()
{
return new HaierConditioner();
}
};
class TCLFactory : public AbstructFactory // TCL 工程类
{
public:
TCLFactory() {}
virtual ~TCLFactory() {}
virtual TV * ProduceTV()
{
return new TCLTV();
}
virtual AirConditioner * ProduceAirconditioner()
{
return new TCLConditioner();
}
};
void main()
{
AbstructFactory *af = new HaierFactory;
TV *htv;
htv = af->ProduceTV();
AirConditioner *hcon;
hcon = af->ProduceAirconditioner();
htv->play();
hcon->changeTemperature();
delete htv;
delete hcon;
delete af;
AbstructFactory *bf = new TCLFactory;
TV *ttv;
ttv = bf->ProduceTV();
ttv->play();
AirConditioner *tcon;
tcon = bf->ProduceAirconditioner();
tcon->changeTemperature();
delete ttv;
delete tcon;
delete bf;
}
输出:
海尔电视机播放中...
海尔空调温度改变中...
TCL电视机播放中...
TCL空调温度改变中...