#ifndef __PIZZA_H__
#define __PIZZA_H__
class Pizza
{
public:
Pizza(){}
virtual ~Pizza(){}
virtual const char* getPizzaName()
{
return "Pizza";
}
}; class NYCheesePizza : public Pizza
{
public:
NYCheesePizza(){}
virtual~NYCheesePizza(){}
virtual const char* getPizzaName()
{
return "NYCheesePizza";
}
}; class NYClamPizza : public Pizza
{
public:
NYClamPizza(){}
virtual~NYClamPizza(){}
virtual const char* getPizzaName()
{
return "NYClamPizza";
}
}; class NYVeggiePizza : public Pizza
{
public:
NYVeggiePizza(){}
virtual~NYVeggiePizza(){}
virtual const char* getPizzaName()
{
return "NYVeggiePizza";
}
}; class ChicagoVeggiePizza : public Pizza
{
public:
ChicagoVeggiePizza(){}
virtual~ChicagoVeggiePizza(){}
virtual const char* getPizzaName()
{
return "ChicagoVeggiePizza";
}
}; class ChicagoClamPizza : public Pizza
{
public:
ChicagoClamPizza(){}
virtual~ChicagoClamPizza(){}
virtual const char* getPizzaName()
{
return "ChicagoClamPizza";
}
}; class ChicagoCheesePizza : public Pizza
{
public:
ChicagoCheesePizza(){}
virtual~ChicagoCheesePizza(){}
virtual const char* getPizzaName()
{
return "ChicagoCheesePizza";
}
}; #endif
#ifndef __PIZZASTORE_H__
#define __PIZZASTORE_H__
#include "Pizza.h"
#include <iostream>
using namespace std;
class PizzaStore
{
public:
PizzaStore()
{
}
virtual~PizzaStore(){}
virtual Pizza* OrderPizza(const char* style)
{
Pizza *p = CreatePizza(style);
cout<<p->getPizzaName()<<endl;
return p;
}
private:
virtual Pizza* CreatePizza(const char* style) = 0
{ }
}; class NYPizzaStore :public PizzaStore
{
public:
NYPizzaStore(){}
virtual ~NYPizzaStore(){}
private:
virtual Pizza* CreatePizza(const char* style)
{
Pizza *p;
if (style == "Cheese")
{
p = new NYCheesePizza();
}
else if (style == "Clam")
{
p = new NYClamPizza();
}
else if (style =="Veggie")
{
p = new NYVeggiePizza();
}
else p = NULL;
return p;
}
}; class ChicagoPizzaStore :public PizzaStore
{
public:
ChicagoPizzaStore(){}
virtual ~ChicagoPizzaStore(){}
private:
virtual Pizza* CreatePizza(const char* style)
{
Pizza *p;
if (style == "Cheese")
{
p = new ChicagoCheesePizza();
}
else if (style == "Clam")
{
p = new ChicagoClamPizza();
}
else if (style == "Veggie")
{
p = new ChicagoVeggiePizza();
}
else p = NULL;
return p;
}
}; #endif
#include "Pizza.h"
#include <iostream>
#include "PizzaStore.h"
using namespace std;
int main()
{
cout << "OK" << endl;
PizzaStore *n = new NYPizzaStore();
Pizza *p = n->OrderPizza("Cheese");
p = n->OrderPizza("Clam"); n = new ChicagoPizzaStore();
p = n->OrderPizza("Cheese");
p = n->OrderPizza("Clam");
return 0;
}

:工厂模式1:方法模式--Pizza的更多相关文章

  1. 设计模式之模版方法模式(Template Method Pattern)

    一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...

  2. 设计模式C#实现(九)——工厂方法模式和简单工厂

    工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...

  3. 【设计模式】工厂方法模式(Factory Method)

    工厂方法模式 定义了一个创建对象的接口,但由子类决定要实现的类是哪一个.工厂方法让类把实例化推迟到子类.所有的工厂模式都用来封装对象的创建.工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创 ...

  4. 我的Java设计模式-工厂方法模式

    女朋友dodo闹脾气,气势汹汹的说"我要吃雪糕".笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?! 但是,雪糕买回来了,她竟然说"不想吃雪糕了,突然想吃披萨" ...

  5. 用C#(.NET Core) 实现简单工厂和工厂方法模式

    本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...

  6. Yii2设计模式——工厂方法模式

    应用举例 yii\db\Schema抽象类中: //获取数据表元数据 public function getTableSchema($name, $refresh = false) { if (arr ...

  7. C#设计模式之5:简单工厂和工厂方法模式

    工厂模式包含三种,简单工厂模式,工厂方法模式,抽象工厂模式.这三种都是解决了一个问题,那就是对象的创建问题.他们的职责就是将对象的创建和对象的使用分离开来. 当我们创建对象的时候,总是会new一个对象 ...

  8. 设计模式:工厂方法模式(Python)

    来自:http://blog.csdn.net/ericzhong83/article/details/7604728 工厂方法模式(Factory Method Pattern): 定义了一个创建对 ...

  9. 设计模式C++实现——工厂方法模式

    模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...

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

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

随机推荐

  1. ffmpeg 加 logo

    How to add a watermark or logo to any corner or the center of a video with FFMPEG. ffmpeg –i video.m ...

  2. <山月记>:中岛敦 -选段

    因为害怕自己并非明珠而不敢刻苦琢磨,又因为有几分相信自己是明珠,而不能与瓦砾碌碌为伍,遂逐渐远离世间,疏避人群,结果在内心不断地用愤懑和羞怒饲育着自己懦弱的自尊心.世上每个人都是驯兽师,而那匹猛兽,就 ...

  3. 雷林鹏分享:XML 树结构

    XML 树结构 XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶". 一个 XML 文档实例 XML 文档使用简单的具有自我描述性的语法: To ...

  4. 雷林鹏分享: C# 简介

    C# 简介 C# 是一个现代的.通用的.面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的. C# 是由 Anders Hejlsberg 和他的团队在 ...

  5. 关于在使用sparksql写程序是报错以及解决方案:org.apache.spark.sql.AnalysisException: Duplicate column(s): "name" found, cannot save to file.

    说明: spark --version : 2.2.0 我有两个json文件,分别是emp和dept: emp内容如下: {"name": "zhangsan" ...

  6. WARNING: CPU: 0 PID: 1 at ./arch/x86/include/asm/fpu/internal.h:373

    ------------[ cut here ]------------WARNING: CPU: 0 PID: 1 at ./arch/x86/include/asm/fpu/internal.h: ...

  7. day 7 -10 集合,文本、文件操作,函数

    day7 一.回顾 1.列表和字典在循环里边尽量不要删除元素,很麻烦 2.元组:如果元组里边只有一个逗号,且不加逗号,次元素是什么类型,就是什么类型. 二.集合 ''' 集合:可变的数据类型,它里边的 ...

  8. mac 下配置Android sdk

    1.通过homebrew进行安装  地址:https://brew.sh/index_zh-cn.html 2.homebrew install android sdk 3.找到路径如: /Users ...

  9. python-flask-Flask-SQLAlchemy与Flask-Migrate联合进行数据化迁移

    使用步骤: 1. 引入Flask-SQLAlchemy from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() 2. 注册 Flask-SQ ...

  10. kohana导入和导出

    一.导入 ini_set('memory_limit', '512M'); require_once(Kohana::find_file('vendor', 'PHPExcel/PHPExcel/IO ...