- #include <iostream>
- #include <string>
- using namespace std;
- // Document抽象类
- class Document
- {
- public:
- // 默认构造函数
- Document(){}
- // 析构函数
- virtual ~Document(){}
- // 返回描述信息
- virtual void GetDiscription() const = 0;
- };
- // TextDocument类
- class TextDocument:public Document
- {
- public:
- // 默认构造函数
- TextDocument():Document(){}
- // 析构函数
- virtual ~TextDocument(){}
- // 返回描述信息
- virtual void GetDiscription() const
- {
- cout << "This is a text document." << endl;
- }
- };
- // ImageDocument类
- class ImageDocument:public Document
- {
- public:
- // 默认构造函数
- ImageDocument():Document(){}
- // 析构函数
- virtual ~ImageDocument(){}
- // 返回描述信息
- virtual void GetDiscription() const
- {
- cout << "This is a image document." << endl;
- }
- };
- // Application抽象类
- class Application
- {
- public:
- // 默认构造函数
- Application(){}
- // 析构函数
- virtual ~Application(){}
- // 打开文件
- void OpenDocument() const
- {
- cout << "Now let's open a document." << endl;
- Document *pDocument = CreateDocument(); // 解藕
- pDocument->GetDiscription();
- delete pDocument;
- }
- private:
- // 创建文件
- virtual Document *CreateDocument() const = 0;
- };
- // MyApplication模板
- template<typename T>
- class MyApplication:public Application
- {
- public:
- // 默认构造函数
- MyApplication():Application(){}
- // 析构函数
- virtual ~MyApplication(){}
- private:
- // 创建文件
- virtual Document *CreateDocument() const
- {
- return new T;
- }
- };
- // Pizza风格枚举
- enum PizzaStyle
- {
- Cheese = 0,
- Clam,
- Veggie
- };
- // Pizza抽象类
- class Pizza
- {
- public:
- // 默认构造函数
- Pizza(){}
- // 析构函数
- virtual ~Pizza() = NULL
- {
- }
- // 准备材料
- void Prepare(){}
- // 烤
- void Bake(){}
- // 切
- void Cut(){}
- // 包装
- void Box(){}
- };
- // NYStyleCheesePizza类
- class NYStyleCheesePizza:public Pizza
- {
- public:
- // 默认构造函数
- NYStyleCheesePizza():Pizza()
- {
- cout << "Create a NYStyleCheesePizza." << endl;
- }
- // 析构函数
- virtual ~NYStyleCheesePizza(){}
- };
- // NYStyleClamPizza类
- class NYStyleClamPizza:public Pizza
- {
- public:
- // 默认构造函数
- NYStyleClamPizza():Pizza()
- {
- cout << "Create a NYStyleClamPizza." << endl;
- }
- // 析构函数
- virtual ~NYStyleClamPizza(){}
- };
- // NYStyleVeggiePizza类
- class NYStyleVeggiePizza:public Pizza
- {
- public:
- // 默认构造函数
- NYStyleVeggiePizza():Pizza()
- {
- cout << "Create a NYStyleVeggiePizza." << endl;
- }
- // 析构函数
- virtual ~NYStyleVeggiePizza(){}
- };
- // ChicagoStyleCheesePizza类
- class ChicagoStyleCheesePizza:public Pizza
- {
- public:
- // 默认构造函数
- ChicagoStyleCheesePizza():Pizza()
- {
- cout << "Create a ChicagoStyleCheesePizza." << endl;
- }
- // 析构函数
- virtual ~ChicagoStyleCheesePizza(){}
- };
- // ChicagoStyleClamPizza类
- class ChicagoStyleClamPizza:public Pizza
- {
- public:
- // 默认构造函数
- ChicagoStyleClamPizza():Pizza()
- {
- cout << "Create a ChicagoStyleClamPizza." << endl;
- }
- // 析构函数
- virtual ~ChicagoStyleClamPizza(){}
- };
- // ChicagoStyleVeggiePizza类
- class ChicagoStyleVeggiePizza:public Pizza
- {
- public:
- // 默认构造函数
- ChicagoStyleVeggiePizza():Pizza()
- {
- cout << "Create a ChicagoStyleVeggiePizza." << endl;
- }
- // 析构函数
- virtual ~ChicagoStyleVeggiePizza(){}
- };
- // PizzaStore抽象类
- class PizzaStore
- {
- public:
- // 默认构造函数
- PizzaStore(){}
- // 析构函数
- virtual ~PizzaStore(){};
- // 订购
- Pizza *Order(PizzaStyle p_CurrentPizzaStyle)
- {
- m_CurrentPizzaStyle = p_CurrentPizzaStyle;
- Pizza *pPizza = CreatePizza();
- pPizza->Prepare();
- pPizza->Bake();
- pPizza->Cut();
- pPizza->Box();
- return pPizza;
- }
- private:
- // 创建Pizza
- virtual Pizza *CreatePizza() const = 0;
- protected:
- // 当前订购的Pizza风格
- PizzaStyle m_CurrentPizzaStyle;
- };
- // NYPizzaStore类
- class NYPizzaStore:public PizzaStore
- {
- public:
- // 默认构造函数
- NYPizzaStore():PizzaStore()
- {
- cout << "Create a NYPizzaStore." << endl;
- }
- // 析构函数
- virtual ~NYPizzaStore(){};
- private:
- // 创建Pizza
- virtual Pizza *CreatePizza() const
- {
- Pizza *pPizza = NULL;
- switch (m_CurrentPizzaStyle)
- {
- case Cheese:
- {
- pPizza = new NYStyleCheesePizza;
- break;
- }
- case Clam:
- {
- pPizza = new NYStyleClamPizza;
- break;
- }
- case Veggie:
- {
- pPizza = new NYStyleVeggiePizza;
- break;
- }
- default:
- {
- cout << "NYPizzaStore donlt sell the pizza of this style." << endl;
- }
- }
- return pPizza;
- }
- };
- // ChicagoPizzaStore类
- class ChicagoPizzaStore:public PizzaStore
- {
- public:
- // 默认构造函数
- ChicagoPizzaStore():PizzaStore()
- {
- cout << "Create a ChicagoPizzaStore." << endl;
- }
- // 析构函数
- virtual ~ChicagoPizzaStore(){};
- private:
- // 创建Pizza
- virtual Pizza *CreatePizza() const
- {
- Pizza *pPizza = NULL;
- switch (m_CurrentPizzaStyle)
- {
- case Cheese:
- {
- pPizza = new ChicagoStyleCheesePizza;
- break;
- }
- case Clam:
- {
- pPizza = new ChicagoStyleClamPizza;
- break;
- }
- case Veggie:
- {
- pPizza = new ChicagoStyleVeggiePizza;
- break;
- }
- default:
- {
- cout << "ChicagoPizzaStore donlt sell the pizza of this style." << endl;
- }
- }
- return pPizza;
- }
- };
- int main ()
- {
- MyApplication<TextDocument> textApplication;
- MyApplication<ImageDocument> imageApplication;
- textApplication.OpenDocument();
- imageApplication.OpenDocument();
- cout << endl;
- NYPizzaStore nyPizzaStore;
- Pizza *pPizza = nyPizzaStore.Order(Cheese);
- delete pPizza;
- pPizza = nyPizzaStore.Order(Clam);
- delete pPizza;
- pPizza = nyPizzaStore.Order(Veggie);
- delete pPizza;
- cout << endl;
- ChicagoPizzaStore chicagoPizzaStore;
- pPizza = chicagoPizzaStore.Order(Cheese);
- delete pPizza;
- pPizza = chicagoPizzaStore.Order(Clam);
- delete pPizza;
- pPizza = chicagoPizzaStore.Order(Veggie);
- delete pPizza;
- system("pause");
- return 0;
- }
- //个人对工厂方法的理解:对于在类内部动态创建具体类对象来说,显式地使用New操作往往
- //意味着增加类本身与具体类的藕合度,而且当此类作为基类被继承时,基类内任何对创建具
- //体类对象代码的修改都将导致不可预料的Bug.工厂方法通过将创建具体类对象的代码延迟
- //到子类中完成了基类和具体类的解藕(基类往往不清楚具体要创建哪个具体类对象),将每
- //个具体子类创建对象的代码局部化于本身,对创建各种具体类对象的代码进行分离,增加了
- //系统的可维护性和可扩展性,减少了因为代码的修改而导致的错误.关于工厂方法的缺点:对
- //于每个子类只创建一种具体类对象的情况,可通过对子类进行模板化避免每次都要创建新的
- //子类;而对于一个子类可选择常见多种具体类对象的情况,可通过使用枚举作为选择时的参照.
设计模式之工厂方法
最新推荐文章于 2024-09-13 19:08:35 发布