Headfirst设计模式的C++实现——抽象工厂(Abstract Factory)
Dough.h
#ifndef _DOUGH_H
#define _DOUGH_H class Dough
{
};
#endif
ThinCrustDough.h
#ifndef _THIN_CRUST_DOUGH_H
#define _THIN_CRUST_DOUGH_H #include "Dough.h" class ThinCrustDough : public Dough
{
};
#endif
Sauce.h
#ifndef _SAUCE_H
#define _SAUCE_H class Sauce
{
};
#endif
MarinaraSauce.h
#ifndef _MARINARA_SAUCE_H
#define _MARINARA_SAUCE_H #include "Sauce.h" class MarinaraSauce : public Sauce
{
};
#endif
Pizza.h
#ifndef _PIZZA_H
#define _PIZZA_H
#include <iostream>
#include <string>
#include "Dough.h"
#include "Sauce.h"
class Pizza
{
public:
Pizza() : m_name(), m_p_dough(NULL), m_p_sauce(NULL) {}
virtual ~Pizza() {}
virtual void prepare() = ;
virtual void bake() { std::cout << "Bake for 25 mins at 350" << std::endl; }
virtual void cut() { std::cout << "Cutting the pizza into diagonal slices" << std::endl; }
virtual void box() { std::cout << "Place pizza in official PizzaStore box" << std::endl; }
void set_name(const std::string &name) { m_name = name; }
std::string get_name() { return m_name; }
Dough *m_p_dough;
Sauce *m_p_sauce;
private:
std::string m_name;
};
#endif
CheesePizza.h
#ifndef _CHEESE_PIZZA_H
#define _CHEESE_PIZZA_H #include "Pizza.h"
#include "PizzaIngredientFactory.h" class CheesePizza : public Pizza
{
private:
PizzaIngredientFactory *m_p_ingredient_factory;
public:
CheesePizza(PizzaIngredientFactory *p) : m_p_ingredient_factory(p) {}
void prepare()
{
std::cout << "Preparing " << get_name() << std::endl;
m_p_sauce = m_p_ingredient_factory->create_sauce();
}
}; #endif
GreekPizza.h
#ifndef _GREEK_PIZZA_H
#define _GREEK_PIZZA_H #include "Pizza.h"
#include "PizzaIngredientFactory.h" class GreekPizza : public Pizza
{
private:
PizzaIngredientFactory *m_p_ingredient_factory;
public:
GreekPizza(PizzaIngredientFactory *p) : m_p_ingredient_factory(p) {}
void prepare()
{
std::cout << "Preparing " << get_name() << std::endl;
m_p_dough = m_p_ingredient_factory->create_dough();
}
}; #endif
PizzaStore.h
#ifndef _PIZZA_STORE_H
#define _PIZZA_STORE_H #include "Pizza.h" class PizzaStore
{
private:
virtual Pizza* CreatePizza(const std::string &type) = ;
public:
Pizza* OrderPizza(const std::string &type)
{
Pizza *p_pizza = CreatePizza(type);
if (p_pizza)
{
p_pizza->prepare();
p_pizza->bake();
p_pizza->cut();
p_pizza->box();
}
return p_pizza;
}
};
#endif
NYPizzaStore.h
#ifndef _NY_PIZZA_STORE_H
#define _NY_PIZZA_STORE_H #include "PizzaStore.h"
#include "CheesePizza.h"
#include "GreekPizza.h"
#include "NYPizzaIngredientFactory.h"
class NYPizzaStore : public PizzaStore
{
private:
Pizza* CreatePizza(const std::string &type)
{
PizzaIngredientFactory *p_factory = new NYPizzaIngredientFactory();
if ( "cheese" == type )
{
Pizza *p_pizza = new CheesePizza( p_factory );
p_pizza->set_name("New York Style Cheese Pizza");
return p_pizza;
}
if ( "greek" == type )
{
Pizza *p_pizza = new GreekPizza( p_factory );
p_pizza->set_name("New York Style Greek Pizza");
return p_pizza;
}
return NULL;
}
};
#endif
PizzaIngredientFactory.h
#ifndef _PIZZA_INGREDIENT_FACTORY_H
#define _PIZZA_INGREDIENT_FACTORY_H #include "Dough.h"
#include "Sauce.h" class PizzaIngredientFactory
{
public:
virtual Dough* create_dough() = ;
virtual Sauce* create_sauce() = ;
}; #endif
NYPizzaIngredientFactory.h
#ifndef _NY_PIZZA_INGREDIENT_FACTORY_H
#define _NY_PIZZA_INGREDIENT_FACTORY_H #include "ThinCrustDough.h"
#include "MarinaraSauce.h" class NYPizzaIngredientFactory : public PizzaIngredientFactory
{
public:
Dough* create_dough() { std::cout << "Creating Thin Crust Dough" << std::endl; return new ThinCrustDough(); }
Sauce* create_sauce() { std::cout << "Creating Marinara Sauce" << std::endl; return new MarinaraSauce(); }
}; #endif
main.cpp
#include "NYPizzaStore.h"
int main()
{
NYPizzaStore pizza_store;
Pizza *p_pizza = pizza_store.OrderPizza("greek");
if ( p_pizza )
{
delete p_pizza;
}
return ;
}
Headfirst设计模式的C++实现——抽象工厂(Abstract Factory)的更多相关文章
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- 面向对象设计——抽象工厂(Abstract Factory)模式
定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...
- 设计模式——抽象工厂(Abstract Factory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...
- 【设计模式】——抽象工厂Abstract Factory
模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...
- 设计模式四: 抽象工厂(Abstract Factory)
简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...
- 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式
趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...
- 工厂模式[3] 抽象工厂 Abstract Factory
简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...
- C2:抽象工厂 Abstract Factory
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合 UM ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
随机推荐
- epoll原理解释(转)
转自:http://yaocoder.blog.51cto.com/2668309/888374 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. ...
- JQuery- 解析JSON数据
我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法.上例中得到的JSON数据如下,是一个嵌套JSON: {,,"nickname&qu ...
- 算法之旅,直奔<algorithm>之十三 fill
fill(vs2010) 引言 这是我学习总结<algorithm>的第十三篇,fill是一个很好的初始化工具.大学挺好,好好珍惜... 作用 fill 的作用是 给容器里一个指定的范围 ...
- 如何在Windows中打开多个Windows Media Player
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在Windows中打开多个Windows Media Player.
- Windows环境下安装Ionic
1. 首先要安装node环境,Ionic的安装和后续的许多前端工具的安装都依赖于node的包管理器npm. nodeJs环境的安装很简单,去官网下载最新版的NodeJs直接安装即可. Nod ...
- 关机相关(shutdown,reboot)
慣用的關機指令: shutdown 由於Linux的關機是那麼重要的工作,因此除了你是在主機前面以tty7圖形介面來登入系統時, 不論用什麼身份都能夠關機之外,若你是使用遠端管理工具(如透過piett ...
- PHP获取IP所在地区(转)
1.获取IP地址的API新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js新浪多地域测试方法:http:/ ...
- android100 自定义内容提供者
#ContentProvider,就是来操作数据的,增删改查, * 四大组件之一 * 应用的数据库是不允许其他应用访问的 * 内容提供者的作用就是让别的应用访问到你的数据库 * 内容提供者的作用:把私 ...
- bash shell for循环1到100 .
前言 用bash shell写程序时,经常会用到for循环,特别是从1到100这种需求,这里记录几种shell中从1到100的循环方法 方法 类c语言 for ((i=1; i<=100; ...
- 实现当UILable的内容超出其范围后自动滚动效果
本文主要介绍 [当UILabel的内容超出其自身的宽度范围后,进行互动展示的效果],我们先来看一下Demo的效果图. 实际实现起来并不十分繁杂,在这里,为了开发的效率,我们使用了一个已经封装好的UIL ...