设计模式之工厂方法

来源:互联网 发布:linux一键lnmp 编辑:程序博客网 时间:2024/04/29 23:20
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. // Document抽象类
  5. class Document
  6. {
  7. public:
  8.     // 默认构造函数
  9.     Document(){}
  10.     // 析构函数
  11.     virtual ~Document(){}
  12.     // 返回描述信息
  13.     virtual void GetDiscription() const = 0;
  14. };
  15. // TextDocument类
  16. class TextDocument:public Document
  17. {
  18. public:
  19.     // 默认构造函数
  20.     TextDocument():Document(){}
  21.     // 析构函数
  22.     virtual ~TextDocument(){}
  23.     // 返回描述信息
  24.     virtual void GetDiscription() const
  25.     {
  26.         cout << "This is a text document." << endl;
  27.     }
  28. };
  29. // ImageDocument类
  30. class ImageDocument:public Document
  31. {
  32. public:
  33.     // 默认构造函数
  34.     ImageDocument():Document(){}
  35.     // 析构函数
  36.     virtual ~ImageDocument(){}
  37.     // 返回描述信息
  38.     virtual void GetDiscription() const
  39.     {
  40.         cout << "This is a image document." << endl;
  41.     }
  42. };
  43. // Application抽象类
  44. class Application
  45. {
  46. public:
  47.     // 默认构造函数
  48.     Application(){}
  49.     // 析构函数
  50.     virtual ~Application(){}
  51.     // 打开文件
  52.     void OpenDocument() const
  53.     {
  54.         cout << "Now let's open a document." << endl;
  55.         Document *pDocument = CreateDocument(); // 解藕
  56.         pDocument->GetDiscription();
  57.         delete pDocument;
  58.     }
  59.     
  60. private:
  61.     // 创建文件
  62.     virtual Document *CreateDocument() const = 0;
  63. };
  64. // MyApplication模板
  65. template<typename T>
  66. class MyApplication:public Application
  67. {
  68. public:
  69.     // 默认构造函数
  70.     MyApplication():Application(){}
  71.     // 析构函数
  72.     virtual ~MyApplication(){}
  73. private:
  74.     // 创建文件
  75.     virtual Document *CreateDocument() const
  76.     {
  77.         return new T;
  78.     }
  79. };
  80. // Pizza风格枚举
  81. enum PizzaStyle
  82. {
  83.     Cheese = 0,
  84.     Clam,
  85.     Veggie
  86. };
  87. // Pizza抽象类
  88. class Pizza
  89. {
  90. public:
  91.     // 默认构造函数
  92.     Pizza(){}
  93.     // 析构函数
  94.     virtual ~Pizza() = NULL
  95.     {
  96.     }
  97.     // 准备材料
  98.     void Prepare(){}
  99.     // 烤
  100.     void Bake(){}
  101.     // 切
  102.     void Cut(){}
  103.     // 包装
  104.     void Box(){}
  105. };
  106. // NYStyleCheesePizza类
  107. class NYStyleCheesePizza:public Pizza
  108. {
  109. public:
  110.     // 默认构造函数
  111.     NYStyleCheesePizza():Pizza()
  112.     {
  113.         cout << "Create a NYStyleCheesePizza." << endl;
  114.     }
  115.     // 析构函数
  116.     virtual ~NYStyleCheesePizza(){}
  117. };
  118. // NYStyleClamPizza类
  119. class NYStyleClamPizza:public Pizza
  120. {
  121. public:
  122.     // 默认构造函数
  123.     NYStyleClamPizza():Pizza()
  124.     {
  125.         cout << "Create a NYStyleClamPizza." << endl;
  126.     }
  127.     // 析构函数
  128.     virtual ~NYStyleClamPizza(){}
  129. };
  130. // NYStyleVeggiePizza类
  131. class NYStyleVeggiePizza:public Pizza
  132. {
  133. public:
  134.     // 默认构造函数
  135.     NYStyleVeggiePizza():Pizza()
  136.     {
  137.         cout << "Create a NYStyleVeggiePizza." << endl;
  138.     }
  139.     // 析构函数
  140.     virtual ~NYStyleVeggiePizza(){}
  141. };
  142. // ChicagoStyleCheesePizza类
  143. class ChicagoStyleCheesePizza:public Pizza
  144. {
  145. public:
  146.     // 默认构造函数
  147.     ChicagoStyleCheesePizza():Pizza()
  148.     {
  149.         cout << "Create a ChicagoStyleCheesePizza." << endl;
  150.     }
  151.     // 析构函数
  152.     virtual ~ChicagoStyleCheesePizza(){}
  153. };
  154. // ChicagoStyleClamPizza类
  155. class ChicagoStyleClamPizza:public Pizza
  156. {
  157. public:
  158.     // 默认构造函数
  159.     ChicagoStyleClamPizza():Pizza()
  160.     {
  161.         cout << "Create a ChicagoStyleClamPizza." << endl;
  162.     }
  163.     // 析构函数
  164.     virtual ~ChicagoStyleClamPizza(){}
  165. };
  166. // ChicagoStyleVeggiePizza类
  167. class ChicagoStyleVeggiePizza:public Pizza
  168. {
  169. public:
  170.     // 默认构造函数
  171.     ChicagoStyleVeggiePizza():Pizza()
  172.     {
  173.         cout << "Create a ChicagoStyleVeggiePizza." << endl;
  174.     }
  175.     // 析构函数
  176.     virtual ~ChicagoStyleVeggiePizza(){}
  177. };
  178. // PizzaStore抽象类
  179. class PizzaStore
  180. {
  181. public:
  182.     // 默认构造函数
  183.     PizzaStore(){}
  184.     // 析构函数
  185.     virtual ~PizzaStore(){};
  186.     // 订购
  187.     Pizza *Order(PizzaStyle p_CurrentPizzaStyle)
  188.     {
  189.         m_CurrentPizzaStyle = p_CurrentPizzaStyle;
  190.         Pizza *pPizza = CreatePizza();
  191.         pPizza->Prepare();
  192.         pPizza->Bake();
  193.         pPizza->Cut();
  194.         pPizza->Box();
  195.         return pPizza;
  196.     }
  197. private:
  198.     // 创建Pizza
  199.     virtual Pizza *CreatePizza() const = 0;
  200. protected:
  201.     // 当前订购的Pizza风格
  202.     PizzaStyle m_CurrentPizzaStyle;
  203. };
  204. // NYPizzaStore类
  205. class NYPizzaStore:public PizzaStore
  206. {
  207. public:
  208.     // 默认构造函数
  209.     NYPizzaStore():PizzaStore()
  210.     {
  211.         cout << "Create a NYPizzaStore." << endl;
  212.     }
  213.     // 析构函数
  214.     virtual ~NYPizzaStore(){};
  215. private:
  216.     // 创建Pizza
  217.     virtual Pizza *CreatePizza() const
  218.     {
  219.         Pizza *pPizza = NULL;
  220.         switch (m_CurrentPizzaStyle)
  221.         {
  222.         case Cheese:
  223.             {
  224.                  pPizza = new NYStyleCheesePizza;
  225.                  break;
  226.             }
  227.         case Clam:
  228.             {
  229.                 pPizza = new NYStyleClamPizza;
  230.                 break;
  231.             }
  232.         case Veggie:
  233.             {
  234.                 pPizza = new NYStyleVeggiePizza;
  235.                 break;
  236.             }
  237.         default:
  238.             {
  239.                 cout << "NYPizzaStore donlt sell the pizza of this style." << endl;
  240.             }
  241.         }
  242.         return pPizza;
  243.     }
  244. };
  245. // ChicagoPizzaStore类
  246. class ChicagoPizzaStore:public PizzaStore
  247. {
  248. public:
  249.     // 默认构造函数
  250.     ChicagoPizzaStore():PizzaStore()
  251.     {
  252.         cout << "Create a ChicagoPizzaStore." << endl;
  253.     }
  254.     // 析构函数
  255.     virtual ~ChicagoPizzaStore(){};
  256. private:
  257.     // 创建Pizza
  258.     virtual Pizza *CreatePizza() const
  259.     {
  260.         Pizza *pPizza = NULL;
  261.         switch (m_CurrentPizzaStyle)
  262.         {
  263.         case Cheese:
  264.             {
  265.                 pPizza = new ChicagoStyleCheesePizza;
  266.                 break;
  267.             }
  268.         case Clam:
  269.             {
  270.                 pPizza = new ChicagoStyleClamPizza;
  271.                 break;
  272.             }
  273.         case Veggie:
  274.             {
  275.                 pPizza = new ChicagoStyleVeggiePizza;
  276.                 break;
  277.             }
  278.         default:
  279.             {
  280.                 cout << "ChicagoPizzaStore donlt sell the pizza of this style." << endl;
  281.             }
  282.         }
  283.         return pPizza;
  284.     }
  285. };
  286. int main ()
  287. {
  288.     MyApplication<TextDocument> textApplication;
  289.     MyApplication<ImageDocument> imageApplication;
  290.     textApplication.OpenDocument();
  291.     imageApplication.OpenDocument();
  292.     cout << endl;
  293.     NYPizzaStore nyPizzaStore;
  294.     Pizza *pPizza = nyPizzaStore.Order(Cheese);
  295.     delete pPizza;
  296.     pPizza = nyPizzaStore.Order(Clam);
  297.     delete pPizza;
  298.     pPizza = nyPizzaStore.Order(Veggie);
  299.     delete pPizza;
  300.     cout << endl;
  301.     ChicagoPizzaStore chicagoPizzaStore;
  302.     pPizza = chicagoPizzaStore.Order(Cheese);
  303.     delete pPizza;
  304.     pPizza = chicagoPizzaStore.Order(Clam);
  305.     delete pPizza;
  306.     pPizza = chicagoPizzaStore.Order(Veggie);
  307.     delete pPizza;
  308.     system("pause");
  309.     return 0;
  310. }
  311. //个人对工厂方法的理解:对于在类内部动态创建具体类对象来说,显式地使用New操作往往
  312. //意味着增加类本身与具体类的藕合度,而且当此类作为基类被继承时,基类内任何对创建具
  313. //体类对象代码的修改都将导致不可预料的Bug.工厂方法通过将创建具体类对象的代码延迟
  314. //到子类中完成了基类和具体类的解藕(基类往往不清楚具体要创建哪个具体类对象),将每
  315. //个具体子类创建对象的代码局部化于本身,对创建各种具体类对象的代码进行分离,增加了
  316. //系统的可维护性和可扩展性,减少了因为代码的修改而导致的错误.关于工厂方法的缺点:对
  317. //于每个子类只创建一种具体类对象的情况,可通过对子类进行模板化避免每次都要创建新的
  318. //子类;而对于一个子类可选择常见多种具体类对象的情况,可通过使用枚举作为选择时的参照.
原创粉丝点击