#ifndef __INGREDIENT_H__
#define __INGREDIENT_H__
#include <iostream>
using namespace std;
class Dough
{ };
class ThinDough:public Dough
{ };
class BigDough :public Dough
{ };
class CaDough :public Dough
{ }; class Sauce
{ }; class MariSauce : public Sauce
{ }; class SariSauce :public Sauce
{ }; class Clams
{ }; class FreshClams : public Clams
{ }; class OldClams :public Clams
{ }; class IngredientFactory
{
public:
IngredientFactory(){}
virtual ~IngredientFactory(){}
virtual Dough* createDough()=0{}
virtual Sauce* createSauce()=0{}
virtual Clams* createClams()=0{}
}; class NYIngredientFactory : public IngredientFactory
{
public:
NYIngredientFactory(){}
virtual ~NYIngredientFactory(){}
virtual Dough* createDough()
{
return new ThinDough();
}
virtual Sauce* createSauce()
{
return new MariSauce();
}
virtual Clams* createClams()
{
return new FreshClams();
}
}; class ChicagoIngredientFactory : public IngredientFactory
{
public:
ChicagoIngredientFactory(){}
virtual ~ChicagoIngredientFactory(){}
virtual Dough* createDough()
{
return new BigDough();
}
virtual Sauce* createSauce()
{
return new SariSauce();
}
virtual Clams* createClams()
{
return new OldClams();
}
}; class CalifoniaIngredientFactory : public IngredientFactory
{
public:
CalifoniaIngredientFactory(){}
virtual ~CalifoniaIngredientFactory(){}
virtual Dough* createDough()
{
return new CaDough();
}
virtual Sauce* createSauce()
{
return new SariSauce();
}
virtual Clams* createClams()
{
return new FreshClams();
}
}; #endif
#ifndef __PIZZA_H__
#define __PIZZA_H__
#include "Ingredient.h"
class Pizza
{
protected:
Dough *dough;
Sauce *sauce;
Clams *clams;
public:
Pizza(){}
virtual ~Pizza(){}
virtual void prepare(){}
void bake()
{
std::cout << "bake" << std::endl;
}
void cut()
{
std::cout << "cut" << std::endl;
}
void box()
{
std::cout << "box" << std::endl;
}
}; class CheesePizza : public Pizza
{
private:
IngredientFactory *ingdFactory;
public:
CheesePizza(IngredientFactory *ifactory)
{
ingdFactory = ifactory;
} virtual ~CheesePizza(){}
virtual void prepare()
{
dough = ingdFactory->createDough();
sauce = ingdFactory->createSauce();
clams = ingdFactory->createClams();
}
}; class ClamPizza : public Pizza
{
private:
IngredientFactory *ingdFactory;
public:
ClamPizza(IngredientFactory *ifactory)
{
ingdFactory = ifactory;
} virtual ~ClamPizza(){}
virtual void prepare()
{
dough = ingdFactory->createDough();
sauce = ingdFactory->createSauce();
clams = ingdFactory->createClams();
}
}; #endif
#ifndef __STORE_H__
#define __STORE_H__
#include "Pizza.h"
class PizzaStore
{
public:
PizzaStore(){}
virtual ~PizzaStore(){}
virtual Pizza* orderPizza(string type)
{
Pizza *p = createPizza(type);
p->bake();
p->cut();
p->box();
return p;
}
private:
virtual Pizza* createPizza(string type) = 0
{ }
}; class NYPizzaStore : public PizzaStore
{
public:
NYPizzaStore(){}
virtual ~NYPizzaStore(){}
private:
virtual Pizza* createPizza(string type)
{ IngredientFactory * ingfy = new NYIngredientFactory();
Pizza *p; if (type =="cheese")
{
p = new CheesePizza(ingfy);
}
else if (type == "clams")
{
p = new ClamPizza(ingfy);
}
else p = NULL;
return p;
}
}; class ChgoPizzaStore :public PizzaStore
{
public:
ChgoPizzaStore(){}
virtual ~ChgoPizzaStore(){}
private:
virtual Pizza* createPizza(string type)
{ IngredientFactory * ingfy = new NYIngredientFactory();
Pizza *p; if (type == "cheese")
{
p = new CheesePizza(ingfy);
}
else if (type == "clams")
{
p = new ClamPizza(ingfy);
}
else p = NULL;
return p;
}
}; class CaliforniaPizzaStore : public PizzaStore
{
public:
CaliforniaPizzaStore(){}
virtual ~CaliforniaPizzaStore(){}
private:
virtual Pizza* createPizza(string type)
{
IngredientFactory * ingfy = new CalifoniaIngredientFactory();
Pizza *p; if (type == "cheese")
{
p = new CheesePizza(ingfy);
}
else if (type == "clams")
{
p = new ClamPizza(ingfy);
}
else p = NULL;
return p;
}
};
#endif
#include "store.h"
int main()
{
PizzaStore *NYstore = new NYPizzaStore();
Pizza *p = NYstore->orderPizza("cheese");
Pizza *p2 = NYstore->orderPizza("clams"); PizzaStore *CalifoniaStore = new CaliforniaPizzaStore();
Pizza *c = CalifoniaStore->orderPizza("cheese");
Pizza *c2 = CalifoniaStore->orderPizza("clams"); return 0;
}

:工厂模式2:抽象工厂模式--Pizza的更多相关文章

  1. 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  2. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  3. head first 设计模式笔记4-工厂模式(简单工厂、工厂方法、抽象工厂)

    1.简单工厂模式 Pizza public abstract class Pizza { abstract void prepare(); abstract void bake(); abstract ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

     1  2 {<HeadFirst设计模式>工厂模式之抽象工厂 }  3 { 抽象工厂的产品                       }  4 { 编译工具:Delphi7.0     ...

  5. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

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

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

  7. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  8. c#工厂模式与抽象工厂模式

    一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...

  9. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  10. PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

    PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...

随机推荐

  1. 通过wifi 连接 adb 到 手机

    网上很多文章都需要先用 usb 线连接先做一下设置,然后才能通过下面的方法连接 julian@julian-ThinkPad-T450:~/tools/android_sdk/platform-too ...

  2. RHEL 5 , 用安装CD作为YUM的Repository

    官方文档写的非常好 14.5. Upgrading the System Off-line with ISO and Yum Create a target directory to mount yo ...

  3. PHP工厂模式的使用场景,使用方法

    所谓工厂模式和生产有关.生产什么呢?生产出来的是一个实例对象.通过什么设备生产?通过一个工厂类生产simpleFactoty.怎么生产呢?工厂类调用自身静态方法来生产对象实例static functi ...

  4. CentOS6.8下实现配置配额

    CentOS6.8下实现配置配额 Linux系统是支持多用户的,即允许多个用户同时使用linux系统,普通用户在/home/目录下均有自己的家目录,在默认状态下,各个用户可以在自己的家目录下任意创建文 ...

  5. 『TensorFlow Internals』笔记_系统架构

    一.架构概览 TensorFlow 的系统结构以 C API 为界,将整个系统分为前端和后端两个子系统: 前端系统:提供编程模型,负责构造计算图: 后端系统:提供运行时环境,负责执行计算图,后端系统的 ...

  6. java多线程wait()方法必须放在while循环里面的原因探析

    1.写一个包子生产消费案例:一次生产或消费一个包子,有包子就消费,没有就生产.(部分代码参考传智播客刘意2015Java基础视频讲义) 1.1 写一个Baozi.class,包含main()方法,用来 ...

  7. 可以进行SHA-1,SHA-224,SHA-256,SHA-384,SHA-512五种算法签名的工具类,以及简单说明

    import java.security.MessageDigest; public class SignatureSHA { public static String signSHA(String ...

  8. json加密

    有的时候我们为了传参数的URL比较安全,我们一般会用json加密的方法来使自己的URL安全. $a['order_sn'] = $orderNo;$data = json_encode( $a);$d ...

  9. oracle 如何创建只有查询权限的用户

    .create user userName identified by password; .grant select any table to userName; --授予查询任何表 .grant ...

  10. ssh -vT git@github.com get “ No such file or directory” 错误

    在"Are you sure you want to continue connnecting"的时候回复y,不要打空格跳过 参考:http://stackoverflow.com ...