#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. VIM编辑器和VI编辑器的区别

    vi 和vim 的区别 写在前面:这个两个"东西"着实让我烦恼一阵子,但是自己一直没当回事,但是遇到了好几次再决定彻底把他们搞的明白,一下是我通过查找资料了解到的关于这两个编辑器的 ...

  2. English trip V1 - B 4.How Do You Make a Salad? 请给我一间房? Teacher:Julia Key:imperatives 祈使句

    In this lesson you will learn to give instructions. 这节课你将将学会给出指示. 课上内容(Lesson) 词汇(Key Word ) bell pe ...

  3. Practical Node.js摘录(2018版)第1,2章。

    大神的node书,免费 视频:https://node.university/courses/short-lectures/lectures/3949510 另一本书:全栈JavaScript,学习b ...

  4. (转)python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

  5. 使用LVM方式安装Ubuntu 16.04

    --- By 小甘丶 注: 这里只讲解如何配置LVM,其他不再陈述! 这个方法,通用的!只要操作系统支持LVM即可!(个人推测,尚未证实) 配置好虚拟机后,开始安装,先进入Ubuntu使用界面,对磁盘 ...

  6. Redis(window版本)安装及使用

    1.打开redis官网http://redis.io/点击Download 2.往下拉,找到Windows,由图片中的文字可以看出Redis项目不正式支持Windows. 但是,Microsoft开放 ...

  7. jq判断网页是在什么浏览器打开的

    有的时候项目中有需要用户扫描二维码进行页面识别跳转操作的,(类似当前需要先判断是否为手机默认浏览器打开,尤其是微信打开会影响APP包的下载-微信内置的一个拦截,这对Android来说影响有点大),因此 ...

  8. java正则表达式中的POSIX 字符类和Unicode 块和类别的类介绍

    假如现在有一个需求,要你用Java语言来匹配出一个文本里面的所有(英文半角)标点符号,你会怎么写呢?我想大多数人应该是把这些符号都罗列出来, 如: !"#$%&'()*+,-./:; ...

  9. InnoDB存储引擎介绍-(4)Checkpoint机制一

    检查点的工作机制: innodb会自动维护一个检查点的机制,叫做 fuzzy checkpointing(当然sharp checkpoint也是检查点之一),fuzzy checkpointing就 ...

  10. SpringBoot热部署:spring-boot-devtools在Idea中热部署方法

    1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency> <groupId>org.sprin ...