创建型模式之工厂模式(Factory Pattern)C++实现******

工厂模式(Factory Pattern)创建型模式.

解决:如何将实例化具体类的代码从应用中抽离,或封装起来,使它们不会干扰应用的其他部分.

专门负责创建各类对象的新对象叫做”工厂”.工厂处理创建对象的细节.

简单工厂模式不是一种模式,只是一种编程习惯.有的人直接把它当作”工厂模式”.

我们需要提供一个对象创建对象的接口,并在子类中提供其具体实现(因为只有在子类中可以决定到底实例化哪一个类)。其最重要的是延迟了子类的实例化。

工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。工厂模式的组成部分:

创建者类:Creator这是抽象创建者类,它定义了一个抽象的工厂方法,让子类实现此方法制造产品。相当于PizzaStore

产品类:工厂生产产品,对PizzaStore来说,产品就是Pizza.

设计原则:1.依赖抽象类,不依赖具体类

         2.变量不可以持有具体类的引用,如果使用new,就会持有具体类的引用。改用工厂方法避开这样的做法。

          3.不要让类派生自具体类。

          4.不要覆盖基类中已经实现的方法。

HeadFirst中的比萨店例子,根据区域的不同开始不同口味的比萨店。

类图:


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>

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值