设计模式之抽象工厂模式

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂允许客户利用抽象的接口产生一组相关的产品,具体的产品通常也是由继承自抽象工厂的具体工厂决定。抽象工厂的类图如下:


在抽象工厂提供了一个产生一组相关产品的接口,而对于这组相关产品,每个具体工厂都会有自己不同的实现。客户可以在自己的类中加入一个抽象工厂的指针或引用,然后将它传入一些针对抽象工厂所写的代码中,这样也能让客户从具体的产品对象中解耦,即做到依赖抽象不依赖具体。

下面是一个利用抽象工厂模式设计的具体例子:



具体程序如下:为了做到精简,程序中只实现了一个具体工厂NYPizzaIngredientFactory,原料也没有全都写出来。

#include "stdafx.h"
#include <iostream>
#include <string>
#include <memory>
using namespace std;

//抽象原料
 class Dough {
 public:
	virtual string toString()=0;
};
 class Sauce {
 public:
	 virtual string toString()=0;
 };
 class Cheese {
 public:
	 virtual string toString()=0;
 };

 class Clams  {
 public:
	 virtual string toString()=0;
 };
 //具体原料
 class ThickCrustDough :public Dough {
 public:
	 string toString() {
		 return "ThickCrust style extra thick crust dough";
	 }
 };
 class MarinaraSauce  :public Sauce  {
 public:
	 string toString() {
		 return "Marinara Sauce";
	 }
 };
 class ReggianoCheese  :public Cheese  {
 public:
	 string toString() {
		 return "Reggiano Cheese";
	 }
 };

 class FreshClams   :public Clams  {
 public:
	 string toString() {
		 return "Fresh Clams from Long Island Sound ";
	 }
 };

//抽象原料工厂,生产产品需要的所有原料,所有的具体工厂必须继承自该工厂
class PizzaIngredientFactory {

public :
	virtual shared_ptr<Dough>  createDough()=0;
	virtual shared_ptr<Sauce> createSauce()=0;
	virtual shared_ptr<Cheese> createCheese()=0;
	virtual shared_ptr<Clams> createClam()=0;

};
//具体原料工厂
 class NYPizzaIngredientFactory :public PizzaIngredientFactory {

 public:
	 shared_ptr<Dough> createDough() {
		return shared_ptr<Dough>(new ThickCrustDough) ;
	}

	shared_ptr<Sauce>  createSauce() {
		return shared_ptr<Sauce>(new MarinaraSauce);
	}

	shared_ptr<Cheese> createCheese() {
		return shared_ptr<Cheese>(new ReggianoCheese);
	}
	shared_ptr<Clams> createClam() {
		return shared_ptr<Clams>(new FreshClams);
	}
};


 //抽象产品(由抽象原料工厂的原料组成)
 class Pizza {
 public:
	 string name;
	 shared_ptr<Dough> dough;
	 shared_ptr<Sauce> sauce;
	 shared_ptr<Cheese> cheese;
	 shared_ptr<Clams> clam;
	 virtual void prepare()=0;

	 void bake()
	 {
		 cout<<"Bake for 25 minutes at 350"<<endl;
	 }
	 void cut()
	 {
		 cout<<"Cutting the pizza into diagonal slices"<<endl;
	 }
	 void box()
	 {
		 cout<<"Place pizza in official PizzaStore box"<<endl;
	 }

	 void setName(string name) {
		 this->name = name;
	 }

	 string getName() {
		 return name;
	 }
 };

//具体产品
class CheesePizza :public Pizza {
	
private:
	shared_ptr<PizzaIngredientFactory> ingredientFactory;
public:
	 CheesePizza(shared_ptr<PizzaIngredientFactory> ingredientFactory) {
		this->ingredientFactory=ingredientFactory;
	}

	void prepare() {
		cout<<"Preparing " <<name;
		dough = ingredientFactory->createDough();
		sauce = ingredientFactory->createSauce();
		cheese = ingredientFactory->createCheese();
		clam=   ingredientFactory->createClam();
	}
};
//具体产品
 class ClamPizza :public Pizza {
 private:
	shared_ptr<PizzaIngredientFactory> ingredientFactory;
 public:
	ClamPizza(shared_ptr<PizzaIngredientFactory> ingredientFactory) {
		this->ingredientFactory=ingredientFactory;
	}

	void prepare() {
		cout<<"Preparing " <<name;
		dough = ingredientFactory->createDough();
		sauce = ingredientFactory->createSauce();
		cheese = ingredientFactory->createCheese();
		clam = ingredientFactory->createClam();
	}
};

class PizzaStore
{
public:
	shared_ptr<Pizza> orderPizza(string type)  
	{
		shared_ptr<Pizza> pizza;        
		pizza=createPizza(type);    //使用工厂方法生成的产品,并不在乎具体产品是什么
		pizza->prepare();
		pizza->bake();
		pizza->cut();
		pizza->box();
		return pizza;
	}
protected:
	virtual shared_ptr<Pizza> createPizza(string type)=0;   //生成产品的方法(抽象工厂与工厂方法的不同主要体现在这个方法中)
};

class NYPizzaStore :public PizzaStore {

protected :
	shared_ptr<Pizza> createPizza(string item) {
		shared_ptr<Pizza> pizza=nullptr;
		shared_ptr<PizzaIngredientFactory> ingredientFactory = 
			shared_ptr<PizzaIngredientFactory>(new NYPizzaIngredientFactory());

		if (item.compare("cheese")==0) {

			pizza = shared_ptr<Pizza>(new CheesePizza(ingredientFactory));
			pizza->setName("New York Style Cheese Pizza");
		}
		else if (item.compare("clam")==0) 
		{
			pizza = shared_ptr<Pizza>(new ClamPizza(ingredientFactory));
			pizza->setName("New York Style Clam Pizza");

		}
		else
			pizza= nullptr;
		return pizza;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	shared_ptr<PizzaStore> nyPizzaStore=shared_ptr<PizzaStore>(new NYPizzaStore);
	shared_ptr<Pizza>pizza= nyPizzaStore->orderPizza("cheese");
	cout<<"I order a "<<pizza->getName()<<endl;

	shared_ptr<Pizza> pizza1=nyPizzaStore->orderPizza("clam");
	cout<<"Xiaoming order a "<<pizza1->getName()<<endl;
	return 0;
}
程序运行结果如下:

程序中,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值