#ifndef __INGREDIENT_H__
#define __INGREDIENT_H__
#include <iostream>
using namespace std;
class Dough
{ };
class ThinDough:public Dough
{ };
class BigDough :public Dough
{ };
class CaDough :public Dough
{ }; class Sauce
{ }; class MariSauce : public Sauce
{ }; class SariSauce :public Sauce
{ }; class Clams
{ }; class FreshClams : public Clams
{ }; class OldClams :public Clams
{ }; class IngredientFactory
{
public:
IngredientFactory(){}
virtual ~IngredientFactory(){}
virtual Dough* createDough()=0{}
virtual Sauce* createSauce()=0{}
virtual Clams* createClams()=0{}
}; class NYIngredientFactory : public IngredientFactory
{
public:
NYIngredientFactory(){}
virtual ~NYIngredientFactory(){}
virtual Dough* createDough()
{
return new ThinDough();
}
virtual Sauce* createSauce()
{
return new MariSauce();
}
virtual Clams* createClams()
{
return new FreshClams();
}
}; class ChicagoIngredientFactory : public IngredientFactory
{
public:
ChicagoIngredientFactory(){}
virtual ~ChicagoIngredientFactory(){}
virtual Dough* createDough()
{
return new BigDough();
}
virtual Sauce* createSauce()
{
return new SariSauce();
}
virtual Clams* createClams()
{
return new OldClams();
}
}; class CalifoniaIngredientFactory : public IngredientFactory
{
public:
CalifoniaIngredientFactory(){}
virtual ~CalifoniaIngredientFactory(){}
virtual Dough* createDough()
{
return new CaDough();
}
virtual Sauce* createSauce()
{
return new SariSauce();
}
virtual Clams* createClams()
{
return new FreshClams();
}
}; #endif
#ifndef __PIZZA_H__
#define __PIZZA_H__
#include "Ingredient.h"
class Pizza
{
protected:
Dough *dough;
Sauce *sauce;
Clams *clams;
public:
Pizza(){}
virtual ~Pizza(){}
virtual void prepare(){}
void bake()
{
std::cout << "bake" << std::endl;
}
void cut()
{
std::cout << "cut" << std::endl;
}
void box()
{
std::cout << "box" << std::endl;
}
}; class CheesePizza : public Pizza
{
private:
IngredientFactory *ingdFactory;
public:
CheesePizza(IngredientFactory *ifactory)
{
ingdFactory = ifactory;
} virtual ~CheesePizza(){}
virtual void prepare()
{
dough = ingdFactory->createDough();
sauce = ingdFactory->createSauce();
clams = ingdFactory->createClams();
}
}; class ClamPizza : public Pizza
{
private:
IngredientFactory *ingdFactory;
public:
ClamPizza(IngredientFactory *ifactory)
{
ingdFactory = ifactory;
} virtual ~ClamPizza(){}
virtual void prepare()
{
dough = ingdFactory->createDough();
sauce = ingdFactory->createSauce();
clams = ingdFactory->createClams();
}
}; #endif
#ifndef __STORE_H__
#define __STORE_H__
#include "Pizza.h"
class PizzaStore
{
public:
PizzaStore(){}
virtual ~PizzaStore(){}
virtual Pizza* orderPizza(string type)
{
Pizza *p = createPizza(type);
p->bake();
p->cut();
p->box();
return p;
}
private:
virtual Pizza* createPizza(string type) = 0
{ }
}; class NYPizzaStore : public PizzaStore
{
public:
NYPizzaStore(){}
virtual ~NYPizzaStore(){}
private:
virtual Pizza* createPizza(string type)
{ IngredientFactory * ingfy = new NYIngredientFactory();
Pizza *p; if (type =="cheese")
{
p = new CheesePizza(ingfy);
}
else if (type == "clams")
{
p = new ClamPizza(ingfy);
}
else p = NULL;
return p;
}
}; class ChgoPizzaStore :public PizzaStore
{
public:
ChgoPizzaStore(){}
virtual ~ChgoPizzaStore(){}
private:
virtual Pizza* createPizza(string type)
{ IngredientFactory * ingfy = new NYIngredientFactory();
Pizza *p; if (type == "cheese")
{
p = new CheesePizza(ingfy);
}
else if (type == "clams")
{
p = new ClamPizza(ingfy);
}
else p = NULL;
return p;
}
}; class CaliforniaPizzaStore : public PizzaStore
{
public:
CaliforniaPizzaStore(){}
virtual ~CaliforniaPizzaStore(){}
private:
virtual Pizza* createPizza(string type)
{
IngredientFactory * ingfy = new CalifoniaIngredientFactory();
Pizza *p; if (type == "cheese")
{
p = new CheesePizza(ingfy);
}
else if (type == "clams")
{
p = new ClamPizza(ingfy);
}
else p = NULL;
return p;
}
};
#endif
#include "store.h"
int main()
{
PizzaStore *NYstore = new NYPizzaStore();
Pizza *p = NYstore->orderPizza("cheese");
Pizza *p2 = NYstore->orderPizza("clams"); PizzaStore *CalifoniaStore = new CaliforniaPizzaStore();
Pizza *c = CalifoniaStore->orderPizza("cheese");
Pizza *c2 = CalifoniaStore->orderPizza("clams"); return 0;
}

:工厂模式2:抽象工厂模式--Pizza的更多相关文章

  1. 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  2. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  3. head first 设计模式笔记4-工厂模式(简单工厂、工厂方法、抽象工厂)

    1.简单工厂模式 Pizza public abstract class Pizza { abstract void prepare(); abstract void bake(); abstract ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

     1  2 {<HeadFirst设计模式>工厂模式之抽象工厂 }  3 { 抽象工厂的产品                       }  4 { 编译工具:Delphi7.0     ...

  5. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  6. 工厂模式[3] 抽象工厂 Abstract Factory

    简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...

  7. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  8. c#工厂模式与抽象工厂模式

    一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...

  9. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  10. PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

    PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...

随机推荐

  1. 动态规划-子数组乘积小于k的总个数 Subarray Product Less Than K

    2018-09-01 23:02:46 问题求解: 问题求解: 最开始的时候,一眼看过去就是一条 dp 嘛,保存每个数字结尾的长度和,最后求和就好,至于长度如何求,本题中需要用滑动窗口来维护. 很好的 ...

  2. 使用spss做方差分析

    还记得上学那会老师专门敲了黑板,强调方差分析很重要..单因素方差分析(Analysis of Variance, ANOVA),如果变量多,就是多因素方差分析,还需要考虑到多重共线性, 也就是线性代数 ...

  3. tchart example

    Random random = new Random(); // Color SeriesColor; int SeriesIndex=0; tChart1.Series.Clear(); Steem ...

  4. 详细讲解Linux下安装python3(Python3.5.4)

    https://jingyan.baidu.com/article/6b97984dd6dbb01ca2b0bf0a.html

  5. English trip V1 - B 21. On a busy day 忙碌的一天 Teacher:Taylor Key: at on in

    In this lesson you will learn to tell the time.  说时间 课上内容(Lesson) at       time; at 7:30; at midday; ...

  6. Axios的默认配置(碎片知识)API

    axios API axios(config) axios({ method: 'Post', url: '/user/123', data: { //略 } }) axios(url[, confi ...

  7. hdu-3001 三进制状态压缩+dp

    用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空 ...

  8. pycharm安装步骤

    python环境配置教程 https://jingyan.baidu.com/article/c45ad29c05c208051653e270.html 由于安装Pycharm时忘记截图了,所以详细安 ...

  9. Oracle11g ADG环境实施文档-1204

    Oracle11g adg 环境搭建实施手册-1204 2017年8月30日 9:16 11g adg 环境搭建实施手册-0824 2017年8月24日 10:18 ################# ...

  10. dubbo 框架和 tomcat 的比较

    接触 dubbo 有一段时间,特别想拿 dubbo 和 tomcat 比较一番. tomcat 是 web 服务器,提供 http 服务,当 tomcat 收到浏览器发送的 http 请求时,根据 u ...