简单工厂并不是一个“真正的“模式,可以把它当作一种编程习惯。它的最大优点在于工厂类中包含必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖
工厂方法模式:定义了一个创建对象的接口,但由于类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
要点:
1.所有的工厂都是用来封闭对象的创建
2.简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦
3.工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象
4.所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合
5.工厂方法允许类将实例化延迟到子类进行
6.依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象
设计原则:依赖倒置:依赖抽象,不要依赖具体类
1.变量不可以持有具体类的引用
2.不要让类派生自具体类
3.不要覆盖基类中已实现的方法
http://dl.iteye.com/upload/attachment/504813/910d8c82-7ed7-3e50-a952-da50bbfd126a.png
Pizza.h
#ifndef PIZZA_H
#define PIZZA_H
#include<iostream>
using namespace std;
enum PizzaType{
CHEESEPIZZA,
VEGGIEPIZZA,
CLAMPIZZA,
PEPPERONIPIZZA
};
class Pizza{
public:
virtual void prepare(){
cout << "prepare..." << endl;
}
void bake(){
cout << "bake..." << endl;
}
void cut(){
cout << "cut..." << endl;
}
void box(){
cout << "box..." << endl;
}
};
class CheesePizza:public Pizza{};
class NYStyleCheesePizza:public Pizza{};
class VeggiePizza:public Pizza{};
class NYStyleVeggiePizza:public Pizza{};
class ClamPizza:public Pizza{};
class NYStyleClamPizza:public Pizza{};
class PepperonPizza:public Pizza{};
class NYStylePepperonPizza:public Pizza{};
#endif // PIZZA_H
PizzaStore.h
#ifndef PIZZASTORE_H
#define PIZZASTORE_H
#include"Pizza.h"
#include"SimplePizzaFactory.h"
class PizzaStore{
public:
explicit PizzaStore(SimplePizzaFactory* spf=NULL){
mFactory = spf;
}
//工厂方法
virtual Pizza* createPizza(PizzaType pt)=0;
//由于pizza是抽象的,orderPizza并不知道哪些实例加进来,也就是解耦
Pizza* orderPizza(PizzaType pt){
Pizza* pizza;
//pizza = mFactory->cratePizza(pt);
pizza = createPizza(pt);
pizza->prepare();
pizza->bake();
pizza->cut();
pizza->box();
return pizza;
}
private:
SimplePizzaFactory* mFactory;
};
class NYPizzaStore:public PizzaStore{
public:
Pizza* createPizza(PizzaType pt){
switch(pt){
case CHEESEPIZZA:
return new NYStyleCheesePizza;
break;
case VEGGIEPIZZA:
return new NYStyleVeggiePizza;
break;
case PEPPERONIPIZZA:
return new NYStylePepperonPizza;
break;
case CLAMPIZZA:
return new NYStyleClamPizza;
break;
default:
return NULL;
break;
}
}
};
#endif // PIZZASTORE_H
SimplePizzaFactory.h
#ifndef SIMPLEPIZZAFACTORY_H
#define SIMPLEPIZZAFACTORY_H
#include"Pizza.h"
#include<stdlib.h>
//简单工厂
class SimplePizzaFactory{
public:
Pizza* cratePizza(PizzaType pt){
switch(pt){
case CHEESEPIZZA:
return new CheesePizza;
break;
case VEGGIEPIZZA:
return new VeggiePizza;
break;
case PEPPERONIPIZZA:
return new PepperonPizza;
break;
case CLAMPIZZA:
return new ClamPizza;
break;
default:
return NULL;
break;
}
}
};
class NYPizzaFactory:public SimplePizzaFactory{
public:
Pizza* createPizza(PizzaType pt){
switch(pt){
case CHEESEPIZZA:
return new NYStyleCheesePizza;
break;
case VEGGIEPIZZA:
return new NYStyleVeggiePizza;
break;
case PEPPERONIPIZZA:
return new NYStylePepperonPizza;
break;
case CLAMPIZZA:
return new NYStyleClamPizza;
break;
default:
return NULL;
break;
}
}
};
#endif // SIMPLEPIZZAFACTORY_H
main.cpp
#include"PizzaStore.h"
int main(){
PizzaStore *store = new NYPizzaStore();
store->orderPizza(CHEESEPIZZA);
}
prepare...
bake...
cut...
box...