:工厂模式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页 ...
随机推荐
- JavaScript 第一章总结
A quick dip into javascipt The way JavaScript works HTML 用一系列的 markup 来呈现整个 content 的 structure.CSS ...
- VPC配置介绍
VPC(Virtual Port-Channel)是Cisco Nexus系列交换机中的一个特性.它支持一个跨机箱的二层Port-Channel.对于第三方设备来说(交换机或服务器)物理上是连接到了两 ...
- PHP设计模式注意点
PHP命名空间 可以更好地组织代码,与Java中的包类似. Test1.php <?php namespace Test1;//命名空间Test1 function test(){ echo _ ...
- python基础之 序列 pickle&json
内容梗概: 1. 什么是序列化 2. pickle(重点) 3. shelve 4. json(重点) 5. configparser模块 1. 什么是序列化 在我们存储数据或者网络传输数据的时候. ...
- bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 后缀自动机在tire树上拓展
题意:有棵树每个点有个颜色(不超过10种),每个节点不超过20个儿子,问你每两点之间的颜色序列不同的有多少种 题解:先建出树,对于每个叶子节点,bfs一遍建在sam上,每次保留当前点在sam上的位置, ...
- pyqt5安装命令
第一步:安装qt5 pip install pyqt5==5.10.1 -i https://pypi.doubanio.com/simple pip install pyqt5-tools -i h ...
- leetcode-algorithms-24 Swap Nodes in Pairs
leetcode-algorithms-24 Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and re ...
- Linux上部署多个tomcat端口设置
在Linux上部署多个tomcat主要是防止端口冲突的问题, tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同.端口一: ...
- 使用axios请求数据,post请求出错。因为axios传递的请求参数是json格式,而后端接口要求是formData
解决办法1:(IOS兼容性有问题,不推荐使用) // json格式转为formData格式,因为某些接口的原因 function json2formData(jsonData) { var param ...
- PAT 1015 Reversible Primes
1015 Reversible Primes (20 分) A reversible prime in any number system is a prime whose "rever ...