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)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
随机推荐
- 数据中心基础设施自动化运维之puppet专项
http://forge.puppetlabs.com/treydock/yum_cron [puppet功能扩展forge] http://docs.puppetlabs.com/referenc ...
- iOS Xcode的快捷键
将一些搜集和经常使用的快捷键记录下来,方便你我. Command +1~ 8: 跳转到导航区的不同位置 Command +0 :显示/隐藏导航区 Command Alt 1~ 6:在不同检测器之间跳转 ...
- Installing the PHP/MongoDB extension on Mac OSX 10.8
Installing PHP/MongoDB extension is a two steps task on OSX: Install the autoconf tool required for ...
- j2ee学习笔记 javascript 学习
JavaScript 组成: ECMAScript + BOM + DOM Window对象是JS中的顶层对象 ECMAScript: 规定了一些语法,变量,for循环等等结构 BOM: Browse ...
- 读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作
ios中数据持久化存储方式一般有5种:NSUserDefault.对象归档(NSKeyedArchiver).文件操作.数据库存储(SQLite3).CoreData. 1.NSUserDefault ...
- Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例
1. 把集合中的数据存储到文本文件案例: 需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...
- WPF遇到无边框的问题
今天做一个项目采用的是WPF开发并且在制作窗体的时候用到无边框的问题,由于WPF开发和winform开发用点不一样, 遇到了这个问题就帮这个遇到问题的解决方法写下来方便以后忘记了和给一些遇到的朋友做一 ...
- JSP 笔记
<%@ page contentType="text/html;charset=UTF-8"%> <!-- 字符编码为utf-8,不然会乱码.... --> ...
- iOS开发UI篇-tableView在编辑状态下的批量操作(多选)
先看下效果图 直接上代码 #import "MyController.h" @interface MyController () { UIButton *button; } @pr ...
- Android环境变量笔记
Logcat打印日志 使用方法Log.i(tag, msg);参数tag: 标签.用于识别Logcat的分类(一般可以使用类名作为标签)数msg: 打印的内容 在eclipse中打开logcat标签W ...