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. sqlserver compact sdf, sqlite 数据库 在net中相对路径设置方法 - 摘自网络

    You should use: Data Source=|DataDirectory|\MyDb.sdf |DataDirectory| points to the App_Data folder. ...

  2. Linux 常见文件打包压缩命令

    .tar 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!)       参数说明:         - ...

  3. 【剪枝】HDU 1010——tempter of the bone

    来源:点击打开链接 看上去数据规模很小,但是必须要剪枝,否则直接爆TLE. 通过这个题可以练习奇偶剪枝. 另外:还有一个优化方式,如果所有步数走完了门还没关,则直接返回结果"NO" ...

  4. Xcode6中使用initWithTitle:title image:image selectedImage:自定义图片

    使用xcode6来运行项目,发现使用原生的tabbar上的图片不显示了. 这个问题是因为xcode6中的一些api方法被废弃了,同时tabbar上图片的渲染方式发生了改变. 先看xcode6中的tab ...

  5. java transient简单介绍

    我们都知道一个对象仅仅要实现了Serilizable接口,这个对象就能够被序列化,java的这样的序列化模式为开发人员提供了非常多便利,我们能够不必关系详细序列化的过程,仅仅要这个类实现了Serili ...

  6. 标准I/O库之定位流

    有三种方法定位标准I/O流. (1)ftell和fseek函数.这两个函数自V7以来就存在了,但是它们都假定文件的位置可以存放在一个长整型中. (2)ftello和fseeko函数.Single UN ...

  7. ccmenu里的位置

    ccmenu里的位置 ccctableviewcell内的元素不需要设置高度 调整buyitem内的元素的位置,可以通过一个item来调整. ccctableview.ccctableviewcell ...

  8. 图层类(CCLayer)

    层 以捕鱼游戏场景为例,场景可以大致分为4层. 菜单层:悬浮于最上方的各种菜单项. 触摸层:处理在屏幕上的触摸点击时间. 动作层:放置鱼.子弹.网等,并处理碰撞. 背景层:背景图片. 如图2-2所示, ...

  9. SqlBulkCopy高效能批量插入SQL SERVER

    what SqlBulkCopy是.NET提供的用来批量插入数据的一个类,特别是将内存中的数据一次性插入到数据库,目前只能插入到SQL SERVER数据库,数据源可以是DataTable.IDataR ...

  10. html笔记04:在html之中导入css两种常见方法

    1.导入式: <html> <head> <title></title> <style type="text/css"> ...