抽象工厂模式:提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。这样客户就可以从具体的产品中被解耦.
要点:
1.抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中
2.抽象工厂创建相关的对象家族,而不需要依赖它们的具体类
关于简单工厂,工厂,抽象工厂的区别,从网上找到一个比较好的实例:
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
[img]http://dl.iteye.com/upload/attachment/504824/c5a9de9a-f507-3fdf-95df-7fd9df221b1a.png[/img]
Pizza.h
#ifndef PIZZA_H
#define PIZZA_H
#include"iostream"
#include"PizzaIngredientFactory.h"
using namespace std;
class Pizza{
public:
explicit Pizza(PizzaIngredientFactory* pif){
mPif = pif;
}
virtual void prepare(){
cout << "prepare..." << endl;
}
virtual void bake(){
cout << "bake..." << endl;
}
virtual void cut(){
cout << "cut..." << endl;
}
virtual void box(){
cout << "box..." << endl;
}
private:
PizzaIngredientFactory* mPif;
};
class CheesePizza:public Pizza{
public:
explicit CheesePizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){
mPif->createDough();
mPif->createClam();
cout << "this is a CheesePizza" << endl;
}
private:
PizzaIngredientFactory* mPif;
};
class VeggiePizza:public Pizza{
public:
explicit VeggiePizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){
mPif->createPepperoni();
mPif->createClam();
cout << "this is a CheesePizza" << endl;
}
private:
PizzaIngredientFactory* mPif;
};
class ClamPizza:public Pizza{
public:
explicit ClamPizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){
mPif->createDough();
mPif->createVeggies();
cout << "this is a CheesePizza" << endl;
}
private:
PizzaIngredientFactory* mPif;
};
class PepperonPizza:public Pizza{
public:
explicit PepperonPizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){
mPif->createPepperoni();
mPif->createSauce();
cout << "this is a CheesePizza" << endl;
}
private:
PizzaIngredientFactory* mPif;
};
#endif // PIZZA_H
PizzaStore.h
#ifndef PIZZASTORE_H
#define PIZZASTORE_H
#include"Pizza.h"
enum PizzaType{
CHEESEPIZZA,
VEGGIEPIZZA,
CLAMPIZZA,
PEPPERONIPIZZA
};
class PizzaStore{
public:
explicit PizzaStore(){
}
void orderPizza(PizzaType pt){
Pizza *pizza;
pizza = createPizza(pt);
pizza->prepare();
pizza->bake();
pizza->cut();
pizza->box();
}
virtual Pizza* createPizza(PizzaType pt)=0;
};
class NYPizzaStore:public PizzaStore{
public:
NYPizzaStore(){
mPif = new NYPizzaIngredientFactory;
}
void orderPizza(PizzaType pt){
Pizza *pizza;
pizza = createPizza(pt);
pizza->prepare();
pizza->bake();
pizza->cut();
pizza->box();
}
Pizza* createPizza(PizzaType pt){
switch(pt){
case CHEESEPIZZA:
return new CheesePizza(mPif);
break;
case VEGGIEPIZZA:
return new VeggiePizza(mPif);
break;
case CLAMPIZZA:
return new ClamPizza(mPif);
break;
case PEPPERONIPIZZA:
return new PepperonPizza(mPif);
break;
default:
return NULL;
break;
}
}
private:
PizzaIngredientFactory* mPif;
};
#endif // PIZZASTORE_H
PizzaIngredientFactory.h
#ifndef PIZZAINGREDIENTFACTORY_H
#define PIZZAINGREDIENTFACTORY_H
#include<iostream>
using namespace std;
//生面团
class Dough{};
//果酱
class Sauce{};
//蔬菜
class Veggies{};
//意大利辣味香肠
class Pepperoni{};
//蛤蜊
class Clam{};
//原料工厂
class PizzaIngredientFactory{
public:
virtual void createDough()=0;
virtual void createSauce()=0;
virtual void createVeggies()=0;
virtual void createPepperoni()=0;
virtual void createClam()=0;
};
class NYPizzaIngredientFactory:public PizzaIngredientFactory{
public:
void createDough(){
cout << "create dough.." << endl;
}
void createSauce(){
cout << "create sauce.." << endl;
}
void createVeggies(){
cout << "create veggies.." << endl;
}
void createPepperoni(){
cout << "create popperoni.." << endl;
}
void createClam(){
cout << "create clam.." << endl;
}
};
#endif // PIZZAINGREDIENTFACTORY_H
main.cpp
#include"PizzaStore.h"
int main(){
PizzaStore *store = new NYPizzaStore();
store->orderPizza(CHEESEPIZZA);
}
create dough..
create clam..
this is a CheesePizza
prepare...
bake...
cut...
box...
另一份代码:
[img]http://dl2.iteye.com/upload/attachment/0100/7504/8ef55117-c0f7-31f6-b0b2-545de20cbea6.png[/img]
SimpleFactory.h
#ifndef SIMPLEFACTORY_H
#define SIMPLEFACTORY_H
class Fruit
{
};
class Apple:public Fruit
{
};
class Pear:public Fruit
{
};
class Orange:public Fruit
{
};
enum FRUIT_TYPE
{
APPLE,
PEAR,
ORANGE
};
class Land
{
public:
Land()
{
mApple = new Apple;
mPear = new Pear;
mOrange = new Orange;
}
~Land(){}
Fruit* create(int fruitType)
{
switch(fruitType)
{
case APPLE:
return mApple;
case PEAR:
return mPear;
case ORANGE:
return mOrange;
default:
return 0;
}
}
private:
Apple* mApple;
Pear* mPear;
Orange* mOrange;
};
#endif // SIMPLEFACTORY_H
FactoryMethod.h
#ifndef FACTORYMETHOD_H
#define FACTORYMETHOD_H
namespace FactoryMethod
{
class Fruit{};
class Apple:public Fruit{};
class Apple1:public Apple{};
class Apple2:public Apple{};
class Apple3:public Apple{};
class Land
{
public:
virtual Fruit* create()=0;
};
class AppleLand:public Land
{
public:
AppleLand()
{
mApple = new Apple;
}
~AppleLand(){}
Fruit* create()
{
return mApple;
}
private:
Apple* mApple;
};
}//end of namespace FactoryMethod
#endif // FACTORYMETHOD_H
AbstractFactory.h
#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H
namespace AbstractFactory
{
class Fruit{};
class Apple:public Fruit{};
class Apple1:public Apple{};
class Apple2:public Apple{};
class Apple3:public Apple{};
class Land
{
public:
virtual Fruit* createType1()=0;
virtual Fruit* createType2()=0;
virtual Fruit* createType3()=0;
};
class Apple1Land:public Land
{
public:
Apple1Land()
{
mApple1 = new Apple1;
mApple2 = new Apple2;
mApple3 = new Apple3;
}
~Apple1Land(){}
Fruit* createType1(){
return mApple1;
}
Fruit* createType2(){
return mApple2;
}
Fruit* createType3(){
return mApple3;
}
private:
Apple* mApple1;
Apple* mApple2;
Apple* mApple3;
};
}//end of namespace AbstractFactory
#endif // ABSTRACTFACTORY_H
main.cpp
#include "SimpleFactory.h"
#include "FactoryMethod.h"
#include "AbstractFactory.h"
int main()
{
Land* land = new Land;
land->create(APPLE);
FactoryMethod::Land* appleLand = new FactoryMethod::AppleLand;
appleLand->create();
AbstractFactory::Land* apple1Land = new AbstractFactory::Apple1Land;
apple1Land->createType1();
}