创建型模式之工厂模式(Factory Pattern)C++实现******
2012-06-29 21:18
585 查看
工厂模式(Factory Pattern)创建型模式.
解决:如何将实例化具体类的代码从应用中抽离,或封装起来,使它们不会干扰应用的其他部分.
专门负责创建各类对象的新对象叫做”工厂”.工厂处理创建对象的细节.
简单工厂模式不是一种模式,只是一种编程习惯.有的人直接把它当作”工厂模式”.
我们需要提供一个对象创建对象的接口,并在子类中提供其具体实现(因为只有在子类中可以决定到底实例化哪一个类)。其最重要的是延迟了子类的实例化。
工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。工厂模式的组成部分:
创建者类:Creator这是抽象创建者类,它定义了一个抽象的工厂方法,让子类实现此方法制造产品。相当于PizzaStore
产品类:工厂生产产品,对PizzaStore来说,产品就是Pizza.
设计原则:1.依赖抽象类,不依赖具体类
2.变量不可以持有具体类的引用,如果使用new,就会持有具体类的引用。改用工厂方法避开这样的做法。
3.不要让类派生自具体类。
4.不要覆盖基类中已经实现的方法。
HeadFirst中的比萨店例子,根据区域的不同开始不同口味的比萨店。
类图:
![](http://my.csdn.net/uploads/201206/29/1340974495_8069.jpg)
C++实现
Product.h头文件:
Product.CPP源文件:
Factory.h头文件
Factory.CPP源文件
主函数main.CPP
运行结果:
![](http://my.csdn.net/uploads/201206/29/1340976227_8780.jpg)
PS:点击进入 两种方法创建简单工厂模式
复制搜索
解决:如何将实例化具体类的代码从应用中抽离,或封装起来,使它们不会干扰应用的其他部分.
专门负责创建各类对象的新对象叫做”工厂”.工厂处理创建对象的细节.
简单工厂模式不是一种模式,只是一种编程习惯.有的人直接把它当作”工厂模式”.
我们需要提供一个对象创建对象的接口,并在子类中提供其具体实现(因为只有在子类中可以决定到底实例化哪一个类)。其最重要的是延迟了子类的实例化。
工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。工厂模式的组成部分:
创建者类:Creator这是抽象创建者类,它定义了一个抽象的工厂方法,让子类实现此方法制造产品。相当于PizzaStore
产品类:工厂生产产品,对PizzaStore来说,产品就是Pizza.
设计原则:1.依赖抽象类,不依赖具体类
2.变量不可以持有具体类的引用,如果使用new,就会持有具体类的引用。改用工厂方法避开这样的做法。
3.不要让类派生自具体类。
4.不要覆盖基类中已经实现的方法。
HeadFirst中的比萨店例子,根据区域的不同开始不同口味的比萨店。
类图:
![](http://my.csdn.net/uploads/201206/29/1340974495_8069.jpg)
C++实现
Product.h头文件:
<span style="font-size:16px;">#ifndef _PRODUCT_H_ #define _PRODUCT_H_ #include <string> #include <list> using namespace std; class Pizza { public: virtual ~Pizza()=0; virtual void prepare(); virtual void bake(); virtual void cut(); virtual void box(); string getName(); protected: Pizza(); string name; //比萨名称 string dough;//面团类型 string sauce;//酱料的类型 }; class NYStyleCheesePizza:public Pizza { public: NYStyleCheesePizza(); ~NYStyleCheesePizza(); }; class ChicagoStyleCheesePizza:public Pizza { public: ChicagoStyleCheesePizza(); ~ChicagoStyleCheesePizza(); void cut(); }; #endif </span>
Product.CPP源文件:
<span style="font-size:16px;">#include "Product.h" #include <iostream> using namespace std; //抽象Pizza类 Pizza::Pizza() { } Pizza::~Pizza() { } void Pizza::prepare() { cout<<"Preparing "<<name<<endl; cout<<"Tossing dough..."<<endl; cout<<"Adding sauce..."<<endl; } void Pizza::bake() { cout<<"Bake for 25 minutes at 350"<<endl; } void Pizza::cut() { cout<<"cutting the pizza into diagonal slices"<<endl; } void Pizza::box() { cout<<"Place pizza in official PizzaStore box"<<endl; } string Pizza::getName() { return name; } //具体Pizza类 NYStyleCheesePizza::NYStyleCheesePizza() { name="NY Style Sauce and Cheese Pizza"; dough="Thin Crust Dough"; sauce="Marinara Sauce"; } NYStyleCheesePizza::~NYStyleCheesePizza() { } ChicagoStyleCheesePizza::ChicagoStyleCheesePizza() { name="Chicago Style Deep Dish Cheese Pizza"; dough="Extra Thick Crust Dough"; sauce="Plum Tomato Sauce"; } ChicagoStyleCheesePizza::~ChicagoStyleCheesePizza() { } void ChicagoStyleCheesePizza::cut() { cout<<"cutting the Pizza into square slices"<<endl; }</span>
Factory.h头文件
<span style="font-size:16px;">#ifndef _FACTORY_H_ #define _FACTORY_H_ #include<string> using namespace std; class Pizza; //工厂类,工厂方法是抽象的 class PizzaStore { public: virtual ~PizzaStore()=0; virtual Pizza * CreatePizza(string type)=0; //工厂方法,子类必须实现该方法,由子类负责创建各种Pizza, Pizza * OrderPizza(string type); protected: PizzaStore(); }; class NYStylePizzaStore:public PizzaStore { public: NYStylePizzaStore(); ~NYStylePizzaStore(); Pizza * CreatePizza(string type); }; #endif </span>
Factory.CPP源文件
<span style="font-size:16px;">#include"Factory.h" #include"Product.h" PizzaStore::PizzaStore() { } PizzaStore::~PizzaStore() { } Pizza * PizzaStore::OrderPizza(string type) { Pizza *pizza=CreatePizza(type); pizza->prepare(); pizza->bake(); pizza->cut(); pizza->box(); return pizza; } NYStylePizzaStore::NYStylePizzaStore() { } NYStylePizzaStore::~NYStylePizzaStore() { } Pizza * NYStylePizzaStore::CreatePizza(string type) { if("cheese"==type) return new NYStyleCheesePizza(); else if("chicago"==type) return new ChicagoStyleCheesePizza(); else return NULL; }</span>
主函数main.CPP
<span style="font-size:16px;">#include "Product.h" #include "Factory.h" #include <iostream> using namespace std; int main(int argc,char* argv[]) { //首先建立一个店 PizzaStore *nyStore=new NYStylePizzaStore(); Pizza *pizza=nyStore->OrderPizza("cheese");//然后利用该店下订单 cout<<"I ordered a "<<pizza->getName()<<endl; return 0; } </span>
运行结果:
![](http://my.csdn.net/uploads/201206/29/1340976227_8780.jpg)
PS:点击进入 两种方法创建简单工厂模式
复制搜索
相关文章推荐
- 创建型模式之抽象工厂模式(AbstractFactory Pattern)C++实现******
- 23种设计模式之工厂模式(创建型,1 Factory,c++实现)
- 设计模式之工厂模式(Factory Pattern)用C++实现
- 大话设计模式--工厂模式 factory -- C++实现实例
- 设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 简单工厂模式(Simple Factory Pattern) - Java实现
- Head First 设计模式 (四) 工厂模式(factory pattern) C++实现
- 大话设计模式--工厂模式 factory -- C++实现实例
- C++设计模式 factory工厂模式,实现绘制几何形状
- C++设计模式 -> 创建型 -> 工厂方式(FactoryMethod)
- 创建型模式--工厂模式(Factory Pattern)
- 我所理解的设计模式(C++实现)——简单工厂模式(Simple Factory Pattern)
- C++实现设计模式: An extensible Factory Pattern example
- 设计模式 - 工厂方法(Factory Method) C++实现
- C++实现设计模式: Factory 工厂模式
- Python实现设计模式--02.工厂模式(Factory Pattern)
- 设计模式(一)之工厂模式(Factory) C++实现
- 创建型模式--工厂模式【Factory Pattern】
- 【设计模式】创建型模式—— 工厂模式(Factory Pattern)
- c++设计模式:工厂模式(Factory Pattern)
- Head First设计模式C++实现--第四章:工厂(Factory)模式