:工厂模式1:方法模式--Pizza
#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的更多相关文章
- 设计模式之模版方法模式(Template Method Pattern)
一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...
- 设计模式C#实现(九)——工厂方法模式和简单工厂
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...
- 【设计模式】工厂方法模式(Factory Method)
工厂方法模式 定义了一个创建对象的接口,但由子类决定要实现的类是哪一个.工厂方法让类把实例化推迟到子类.所有的工厂模式都用来封装对象的创建.工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创 ...
- 我的Java设计模式-工厂方法模式
女朋友dodo闹脾气,气势汹汹的说"我要吃雪糕".笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?! 但是,雪糕买回来了,她竟然说"不想吃雪糕了,突然想吃披萨" ...
- 用C#(.NET Core) 实现简单工厂和工厂方法模式
本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...
- Yii2设计模式——工厂方法模式
应用举例 yii\db\Schema抽象类中: //获取数据表元数据 public function getTableSchema($name, $refresh = false) { if (arr ...
- C#设计模式之5:简单工厂和工厂方法模式
工厂模式包含三种,简单工厂模式,工厂方法模式,抽象工厂模式.这三种都是解决了一个问题,那就是对象的创建问题.他们的职责就是将对象的创建和对象的使用分离开来. 当我们创建对象的时候,总是会new一个对象 ...
- 设计模式:工厂方法模式(Python)
来自:http://blog.csdn.net/ericzhong83/article/details/7604728 工厂方法模式(Factory Method Pattern): 定义了一个创建对 ...
- 设计模式C++实现——工厂方法模式
模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
随机推荐
- js插件---bootstrap插件daterangepicker是什么
js插件---bootstrap插件daterangepicker是什么 一.总结 一句话总结:日期段选择插件,也可选择日期 日期段选择插件,也可选择日期 1.daterangepicker 控件如何 ...
- app和bootloader跳转 MSP与PSP
1.不要把跳转函数放在中断中,如此导致在跳转后的app或者bootloder都是在中断状态,只要你一开启该中断,就可能出现硬件中断了 2.如果你的APP使用了ucos系统,在跳转函数中还需要增加__s ...
- spring cloud: Hystrix(八):turbine集群监控(dashboard)
turbine是聚合服务器发送事件流数据的一个工具,hystrix的监控中,只能监控单个节点,实际生产中都为集群, 因此可以通过turbine来监控集群下hystrix的metrics情况,通过eur ...
- 【转】 详解C中volatile关键字
转自: http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有可能 ...
- 20165327 学习基础和C语言基础调查
学习基础和C语言基础调查 一.关于技能 1. 你有什么技能比大多人(超过90%以上)更好? 根据数据来看,应该是短跑(几次测速50米平均时间6.5s),上学期的体测中短跑这项成绩在班上排前面,我们这个 ...
- English Voice of <<See You Again >>
<See You Again >(<当我们再相见>) 演唱:Wiz Khalifa/Charlie Puth 维兹·卡利法/查理·普斯 It's been a long da ...
- Linux网桥配置
CentOS:1.配置临时网桥,重启后风格配置丢失[root@CentOS ~]# yum -y install bridge-utils[root@CentOS ~]# brctl addbr br ...
- SQL SERVER 子查询使用Order By;按In排序
[子查询]使用order by percent * from table order by id) a 这时发现结果没有按id排序,需要将100 percent 改成 99.999 percent 或 ...
- hdu 1025LIS思路同1257 二分求LIS
题目: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- ECharts 报表事件联动系列二:柱状图,饼状图添加事件
代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...