Headfirst设计模式的C++实现——简单工厂模式(Simple Factory)之二
为了引出后续的工厂方法,把在简单工厂模式的基础上增加了新功能——加盟店
简而言之就是把原来的单一简单工厂(能生产cheese和greek两种pizza)细分成了纽约地区的和芝加哥地区的(每种地区都能生产cheese和greek两种pizza)
和之前的简单工厂相比,PizzaStore中的PizzaFactory由构造时传入一个引用,从SimplePizzaFactory中派生出两个类,原来的cheese和greek Pizza也根据地区做了扩展。
Pizza.h
#ifndef _PIZZA_H
#define _PIZZA_H
#include <iostream>
#include <string> class Pizza
{
public:
Pizza(const std::string &type) : m_type(type) {}
virtual ~Pizza() {}
virtual void prepare() { std::cout << "prepare " << m_type << std::endl; }
virtual void bake() { std::cout << "bake " << m_type << std::endl; }
virtual void cut() { std::cout << "cut " << m_type << std::endl; }
virtual void box() { std::cout << "box " << m_type << std::endl; }
private:
std::string m_type;
};
#endif
ChiChagoCheesePizza.h
#ifndef _CHICHAGO_CHEESE_PIZZA_H
#define _CHICHAGO_CHEESE_PIZZA_H
#include <iostream>
#include "Pizza.h" class ChiChagoCheesePizza : public Pizza
{
public:
CChiChagoheesePizza() : Pizza("chichago cheese") {}
~ChiChagoCheesePizza() {}
};
#endif
ChiChagoGreekPizza.h
#ifndef _CHICHAGO_GREEK_PIZZA_H
#define _CHICHAGO_GREEK_PIZZA_H
#include <iostream>
#include "Pizza.h" class ChiChagoGreekPizza : public Pizza
{
public:
ChiChagoGreekPizza() : Pizza("chichago greek") {}
~ChiChagoGreekPizza() {}
}; #endif
NYCheesePizza.h
#ifndef _NY_CHEESE_PIZZA_H
#define _NY_CHEESE_PIZZA_H
#include <iostream>
#include "Pizza.h" class NYCheesePizza : public Pizza
{
public:
NYCheesePizza() : Pizza("ny cheese") {}
~NYCheesePizza() {}
};
#endif
NYGreekPizza.h
#ifndef _NY_GREEK_PIZZA_H
#define _NY_GREEK_PIZZA_H
#include <iostream>
#include "Pizza.h" class NYGreekPizza : public Pizza
{
public:
NYGreekPizza() : Pizza("ny greek") {}
~NYGreekPizza() {}
}; #endif
SimplePizzaFactory.h
#ifndef _SIMPLE_PIZZA_FACTORY
#define _SIMPLE_PIZZA_FACTORY #include "Pizza.h" class SimplePizzaFactory
{
public:
virtual Pizza *CreatePizza(const std::string &type) = ;
};
#endif
ChiChagoPizzaFactory.h
#ifndef _CHICHAGO_PIZZA_FACTORY_H
#define _CHICHAGO_PIZZA_FACTORY_H #include "SimplePizzaFactory.h"
#include "ChiChagoCheesePizza.h"
#include "ChiChagoGreekPizza.h" class ChiChagoPizzaFactory : public SimplePizzaFactory
{
public:
Pizza *CreatePizza(const std::string &type)
{
if ( "cheese" == type )
{
return new ChiChagoCheesePizza();
}
if ( "greek" == type )
{
return new ChiChagoGreekPizza();
}
return NULL;
}
};
#endif
NYPizzaFactory.h
#ifndef _NY_PIZZA_FACTORY_H
#define _NY_PIZZA_FACTORY_H #include "SimplePizzaFactory.h"
#include "NYCheesePizza.h"
#include "NYGreekPizza.h" class NYPizzaFactory : public SimplePizzaFactory
{
public:
Pizza *CreatePizza(const std::string &type)
{
if ( "cheese" == type )
{
return new NYCheesePizza();
}
if ( "greek" == type )
{
return new NYGreekPizza();
}
return NULL;
}
};
#endif
PizzaStore.h
#ifndef _PIZZA_STORE_H
#define _PIZZA_STORE_H
#include "SimplePizzaFactory.h" class PizzaStore
{
private:
SimplePizzaFactory &m_pizza_factory;
public:
PizzaStore(SimplePizzaFactory &pizza_factory) : m_pizza_factory(pizza_factory) {}
Pizza* OrderPizza(const std::string &type)
{
Pizza *p_pizza = m_pizza_factory.CreatePizza(type);
if (p_pizza)
{
p_pizza->prepare();
p_pizza->bake();
p_pizza->cut();
p_pizza->box();
}
return p_pizza;
}
};
#endif
main.cpp
#include "PizzaStore.h"
#include "NYPizzaFactory.h"
int main()
{
NYPizzaFactory ny_pizza_factory;
PizzaStore pizza_store(ny_pizza_factory);
Pizza *p_pizza = pizza_store.OrderPizza("greek");
if ( p_pizza )
{
delete p_pizza;
}
return ;
}
Headfirst设计模式的C++实现——简单工厂模式(Simple Factory)之二的更多相关文章
- Headfirst设计模式的C++实现——简单工厂模式(Simple Factory)
Pizza.h #ifndef _PIZZA_H #define _PIZZA_H #include <iostream> #include <string> class Pi ...
- 设计模式之简单工厂模式Simple Factory(四创建型)
工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...
- 【设计模式】简单工厂模式 Simple Factory Pattern
简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- 创建型模式(前引)简单工厂模式Simple Factory
一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...
- 大白话简单工厂模式 (Simple Factory Pattern)
大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...
- 设计模式的征途—2.简单工厂(Simple Factory)模式
工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...
- 设计模式之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式的由来 所有设计模式都是为解决某类问题而产生的,那么简单工厂模式是为解决什么问题呢?我们假设有以下业务场景: 在一个学生选课系统中,文科生用户选课时,我们要获得文科生的所有课程列表:理 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
随机推荐
- poj 2325 Persistent Numbers (贪心+高精度)
把输入数字每次从9-2除,能整除则记录该数字,最后从小到大输出. 应该算是水题,不过窝第一次写高精度除法,虽然1A,不过中间改了好多次. /****************************** ...
- YII访问数据库
YII访问数据库 CDbConnection: 一个抽象数据库连接 CDbCommand: SQL statement CDbDataReader: 匹配结果集的一行记录 CDbTransaction ...
- JS多态
面向对象语言有三大特征,前面介绍了封装和继承,那么JS作为一门面向对象语言,有多态么,又怎么实现多态呢? 我们先看看多态的概念: 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果. ...
- 使用sessionStorage得一个坑
1.首先sessionStorage.setItem("isMybill" false) 2.使用的时候 sessionStorage.getItem('isMybill') / ...
- 树莓派通过 HDMI - VGA 转接后分辨率始终为640*480无法修改的问题
一开始装的Raspbian,感觉系统不错,就是分辨率调不了,网上找了很多解决方法,捣鼓了差不多一天,仍然没有解决. 期间尝试换了好几个系统,比如说 raspbmc .XBian等,最后试了下Pidor ...
- iOS从生成证书到打包上架-02(详细2016-10最新)
由于篇幅的限制,这篇接着上一篇(关于证书)写的,有需要的小伙伴可以先阅读上一篇 2.在App Store创建应用 1.回到Account,点击iTunes Connect 2.点击我的App 3.点击 ...
- jbpm与spring hibernate struts整合
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- linux命令行模式下实现代理上网
有些公司的局域网环境,例如我们公司的只允许使用代理上网,图形界面的很好解决就设置一下浏览器的代理就好了,但是linux纯命令行的界面就....下面简单几步就可以实现了! 一.命令行界面的一般代理设置方 ...
- Spring mvc Interceptor 解决Session超时配置流程
最近公司内部框架中对Session超时这一功能未实现,由于采用iframe结构,Session超时后,当点击左侧系统菜单时,会在iframe的右侧再次弹出登陆框. 该问题是由于没有设置拦截器造成. 添 ...
- RHCA442学习笔记-Unit11内存回收
Unit 12 Memory Reclamation 内存回收 学习目标: A. 了解和调整内存回收 ...