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)的更多相关文章

  1. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  2. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

  3. 设计模式——抽象工厂(Abstract Factory)

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...

  4. 【设计模式】——抽象工厂Abstract Factory

    模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...

  5. 设计模式四: 抽象工厂(Abstract Factory)

    简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...

  6. 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式

    趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...

  7. 工厂模式[3] 抽象工厂 Abstract Factory

    简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...

  8. C2:抽象工厂 Abstract Factory

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合 UM ...

  9. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

随机推荐

  1. cloud-utils cloud-utils-growpart cloud-init

  2. iptables/netfilter命令、实现及利用(转)

    原文链接:http://blog.csdn.net/sealyao/article/details/5934268 一.Netfilter和Iptables概述 netfilter/iptables ...

  3. HTML---Android与js交互实例

    Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaScript(HTML) ...

  4. 【开发工具 - Git】之Git使用案例

    本帖主要介绍一下Git在实际项目开发中的使用流程,包括克隆.暂存.提交.推送.拉取.分支.冲突解决等,暂时还不包括回退. 1.首先需要安装Git,下一步下一步就行,这里就不说了.值得一提的是,如果Gi ...

  5. 织梦/dedecms 当文章转载时不需要设置图片水印的设置,取消’图片是否加水印‘的复选框,并且修改如下文件即可生效

    当想添加水印是选中“图片是否加水印”复选框即可. 找到include/helpers/image.helper.php这个文件,在里面找到中的if( isset($GLOBALS['needwater ...

  6. PowerShell随笔2_分支 选择 循环 特殊变量

    PowerShell特殊变量: PowerShell的特殊变量由系统自动创建.用户自定义的变量名称应该不和特殊变量相同. $^ :前一命令行的第一个标记 $$ :前一命令行的最后一个标记 $_ :表示 ...

  7. Java bit、byte、位、字节、汉字、字符

    package com.suypower.chengyu.test; public class ByteTest { /** * byte 8 bits -128 - + 127 * 1 bit = ...

  8. Android 软件开发之 PreferenceActivity 中的组件

    1.PreferenceActivity 介绍 PreferenceActivity 继承ListActivity 它是以一个列表的形式在展现内容,它最主要的特点是添加Preference可以让控件的 ...

  9. Linux 汇编语言开发指南

    http://www.ibm.com/developerworks/cn/linux/l-assembly/

  10. [转]JavaScript作用域安全构造函数

          构造函数其实就是一个使用new操作符调用的函数.当使用new调用时,构造函数内用到的this对象会对指向新创建的对象实例,如下的例子所示: function Person(name, ag ...