抽象工厂模式
抽象工厂模式的概念
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向 客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品 族的产品对象。
抽象工厂的角色及其职责
- 抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
- 具体工厂( Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
- 抽象(Product)角色 抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
- 具体产品(ConcreteProduct)角色 抽象模式所创建的具体实例对象
产品组和产品等级结构
工厂模式:要么生产香蕉,要么生产苹果、要么生产西红柿;但是不能同时生产一 个产品组。抽象工厂:能同时生产一个产品族
而抽象工厂模式就可以生产一个产品族
产品等级结构:
生产香蕉。苹果。梨子。但是每种水果都有不同的等级,有的好吃,有的难吃。
产品族
南方香蕉/苹果/梨子(这是一个产品组)
北方香蕉/苹果/梨子 (这是另外一个产品族)
抽象工厂模式的实现
#include<iostream>
using namespace std;//抽象苹果
class AbstractApple{
public:virtual void ShowName() = 0;
};//中国苹果
class ChinaApple :public AbstractApple{
public:virtual void ShowName(){cout << "中国苹果" << endl;}
};class USAApple :public AbstractApple{
public:virtual void ShowName(){cout << "美国苹果" << endl;}
};
class JapanApple :public AbstractApple{
public:virtual void ShowName(){cout << "日本苹果" << endl;}
};
//抽象香蕉
class AbsrtactBanana{
public:virtual void ShowName() = 0;
};//中国香蕉
class ChinaBanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "中国香蕉" << endl;}
};
class USABanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "美国香蕉" << endl;}
};
class JapanBanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "日本香蕉" << endl;}
};//抽象的梨子
class AbsrtactPear{
public:virtual void ShowName() = 0;
};//中国梨子
class ChinaPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "中国梨子" << endl;}
};
//美国梨子
class USAPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "美国梨子" << endl;}
};
//日本梨子
class JapanPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "日本梨子" << endl;}
};//抽象工厂 针对产品族
class AbstractFactoty{
public:virtual AbstractApple *CreateApple() = 0;virtual AbsrtactBanana *CreateBanana() = 0;virtual AbsrtactPear* CreatePear() = 0;
};//中国工厂
class ChinaFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new ChinaApple;}virtual AbsrtactBanana *CreateBanana(){return new ChinaBanana;}virtual AbsrtactPear* CreatePear() {return new ChinaPear;}
};
//美国工厂
class USAFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new USAApple;}virtual AbsrtactBanana *CreateBanana(){return new USABanana;}virtual AbsrtactPear* CreatePear() {return new USAPear;}
};
//日本工厂
class JapanFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new JapanApple;}virtual AbsrtactBanana *CreateBanana(){return new JapanBanana;}virtual AbsrtactPear* CreatePear() {return new JapanPear;}
};void test01(){AbstractFactoty *factory = NULL;AbstractApple *apple = NULL;AbsrtactBanana *banana = NULL;AbsrtactPear *pear = NULL;//中国工厂factory = new ChinaFactory; apple = factory->CreateApple();banana = factory->CreateBanana();pear = factory->CreatePear();apple->ShowName();banana->ShowName();pear->ShowName();delete apple;delete banana;delete pear;
}int main(void){test01();system("pause");return 0;
}