#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. m_Orchestrate learning system---mo系统权限思考

    m_Orchestrate learning system---mo系统权限思考 一.总结 一句话总结:注意不同身份访问同一客户端时候的权限,比如面板显示,比如功能按钮 权限 面板 功能 1.小组之间 ...

  2. 《HTTP 权威指南》笔记:第十三章 摘要认证体制

    前言 基本认证存在缺陷,摘要认证为了解决基本认知的一些缺陷,进行了进一步的完善,更加安全. 流程 摘要认证的特点是:永远不会以明文方式在网络上发送密码原理:通过发送一个「指纹」或者「密码的摘要」来验证 ...

  3. Mac 上搭建基于 Hexo + GitHub 个人博客

    环境配置 本人电脑系统:macOS Node.js 生成静态页面.安装Node.js Git 用于将本地 Hexo 内容提交到 Github.Xcode自带Git(前提:macOS已经安装了Xcode ...

  4. LeetCode--005--最长回文子串(java)

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...

  5. Sphinx实时索引

    数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到“主索引+增量索引”的思路来解决,这个模式实现的基本原理是设置两个数据源和两个索引. ...

  6. Merge K Sorted List(含Merge Two Sorted LIst) leetcode java

    问题描述: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complex ...

  7. 在写makefile过程中遇到的问题

    老师布置了linux实验作业,本身不打算写了,反正也不交实验报告,但刚好项目也需要,所以就研究了makefile.不过还是要批评自己,怎么能这么的颓废呢? 刚开始做的时候出现了这样的错误,代码如下: ...

  8. 谈一谈HashMap类

    一.Java中的hashCode()和equals() 1. hashCode()的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode()是用来在散列存储结构中确定对 ...

  9. 【实战问题】【2】Ambiguous mapping found. Cannot map 'xxController.Create' bean method

    正文: 启动项目时出现该报错. 原因为:在controller中url映射出现重复,@RequestMapping(value = "user/create"). 解决方案为:全局 ...

  10. PAT 1050 String Subtraction

    1050 String Subtraction (20 分)   Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be t ...