工厂方法模式
定义:
工厂方法模式定义了一个创建对象的接口,但由子类决定实例化具体哪一个类。工厂方法将类的实例化推迟到子类。
ClassDiagram:
当客户像PizzaStore要CheesePizza时(call orderPizza()),orderPizza会调用具体子类实现的CheesePizzaStore.createPizza(),这样具体创建Pizza对象的操作就延迟到了工厂的子类。
PizzaStore.sh
- #if !defined(_PIZZASTORE_H)
- #define _PIZZASTORE_H
- #include "Pizza.h"
- #include <string>
- using namespace std;
- class PizzaStore
- {
- public:
- Pizza* orderPizza(string type);
- virtual Pizza* createPizza(string type) = 0;
- };
- #endif //_PIZZASTORE_H
CheesePizzaStore.h
- #if !defined(_CHEESEPIZZASTORE_H)
- #define _CHEESEPIZZASTORE_H
- #include "PizzaStore.h"
- class CheesePizzaStore : public PizzaStore
- {
- public:
- Pizza* createPizza(string type);
- };
- #endif //_CHEESEPIZZASTORE_H
Pizza.h
- #if !defined(_PIZZA_H)
- #define _PIZZA_H
- class Pizza
- {
- public:
- void prepare();
- void bake();
- void cut();
- void box();
- };
- #endif //_PIZZA_H
CheesePizza.h
- #if !defined(_CHEESEPIZZA_H)
- #define _CHEESEPIZZA_H
- #include "Pizza.h"
- class CheesePizza : public Pizza
- {
- public:
- CheesePizza();
- };
- #endif //_CHEESEPIZZA_H
Test.cpp
- #include "stdafx.h"
- #include "PizzaStore.h"
- #include "CheesePizzaStore.h"
- #include "ClamPizzaStore.h"
- int main(int argc, char* argv[])
- {
- printf("Hello World!\n");
- PizzaStore* ps = new CheesePizzaStore();
- ps->orderPizza("Cheese");
- PizzaStore* ps2 = new ClamPizzaStore();
- ps2->orderPizza("Clam");
- return 0;
- }
Output:
- Hello World!
- Cheese Pizza prepare bake cut box.
- Clam Pizza prepare bake cut box.
- Press any key to continue
相对来说,简单工厂、工厂方法都是比较理解的设计模式,也是很实用的模式,它对象的生成与使用相分离,也就是解耦合,我们想用对象,从工厂获取就可以。
本节重点是,相较简单方法,工厂方法中工厂(PizzaStore)提供抽象工厂方法(createPizza()),由子类来实现,已达到创建Pizza对象后移到工厂子类。
完整的项目代码,VC6.0工程。
阅读(837) | 评论(0) | 转发(0) |