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.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
随机推荐
- Codeforces149E - Martian Strings(KMP)
题目大意 给定一个字符串T,接下来有n个字符串,对于每个字符串S,判断是否存在T[a-b]+T[c-d]=S(1 ≤ a ≤ b < c ≤ d ≤ length(T)) 题解 对于每个字符串S ...
- 详细讲解Hadoop源码阅读工程(以hadoop-2.6.0-src.tar.gz和hadoop-2.6.0-cdh5.4.5-src.tar.gz为代表)
首先,说的是,本人到现在为止,已经玩过. 对于,这样的软件,博友,可以去看我博客的相关博文.在此,不一一赘述! Eclipse *版本 Eclipse *下载 Jd ...
- 全英文版时间格式化07/29/2010 4:14:01 PM
之前格式化,AM PM出不来,总是显示上午 下午 aspx页面的绑定: <%#Eval("AddDate") == DBNull.Value ? "" : ...
- Video Surveillance - POJ 1474(判断是否存在内核)
题目大意:询问是否在家里装一个监视器就可以监控所有的角落. 分析:赤裸裸的判断多边形内核题目. 代码如下: #include<iostream> #include<string.h& ...
- Spring3.0 AOP 具体解释
一.什么是 AOP. AOP(Aspect Orient Programming),也就是面向切面编程.能够这样理解,面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度 ...
- systemtap 列出所有linux 内核模块与相关函数2
[root@localhost src]# uname -aLinux localhost.localdomain 2.6.32 #1 SMP Sun Sep 20 18:58:21 PDT 2015 ...
- System Address Map Initialization in x86/x64 Architecture Part 2: PCI Express-Based Systems
原文 http://resources.infosecinstitute.com/system-address-map-initialization-x86x64-architecture-pa ...
- C#读取Exeal文件
今天写一个读取Exeal的时候遇到一个问题就是引用了Mircosotf.Office.Interop.Exeal类库的时候没有办法读取到 纠结了好久百度了一下发现别人是这样写的using Exeal= ...
- jquery的效果地址
http://www.cnblogs.com/lhb25/p/50-jquery-plugins-g.html
- Hadoop的伪分布式搭建
我们在搭建伪分布式Hadoop环境,需要将一系列的配置文件配置好. 一.配置文件 1. 配置文件hadoop-env.sh export JAVA_HOME=/opt/modules/jdk1.7.0 ...