1. 场景

假设有如下的场景:

卖pizza的, 可以有很多种pizza(CheesePizza, GreekPizza, PepperoniPizza),我们该如何处理它呢,当然我们可以声明一个类,类中创建每一个种类的pizza。但是这样有什么问题吗?我们没有把需要改变的部分剥离出来。软件设计的一个原则就是“是易于扩充而不是修改”,另一个是“对接口编程而不是对实现编程”。

这里就轮到工厂模式出手了。 工厂模式有三种:

  • 简单工厂
  • 抽象工厂
  • 工厂方法

2. 简单工厂模式

1.1 Uml

1.2 源代码

class Pizza
{ public: Pizza(){}; virtual ~Pizza(){};virtual void MakePizza() = 0;
};class CheesePizza : public Pizza
{ public: CheesePizza(){}; ~CheesePizza(){};void MakePizza()
{ cout << "make cheese pizza" <<endl;
}
};class GreekPizza : public Pizza
{
public: GreekPizza(){}; ~GreekPizza(){};void MakePizza() { cout << "make greek pizza" <<endl; }};class PepperoniPizza : public Pizza
{
public: PepperoniPizza(){}; ~PepperoniPizza(){};void MakePizza() { cout << "make peperoni pizza" <<endl; }};enum PIZZA_TYPE
{ PIZZA_TYPE_CHEESE = 0, PIZZA_TYPE_GREEK, PIZZA_TYPE_PEPPERONI
};class PizzaFactory
{
public: PizzaFactory(){}; ~PizzaFactory(){};static shared_ptr<Pizza> createPizza(PIZZA_TYPE pizzaType) { switch (pizzaType) { case PIZZA_TYPE_CHEESE: return shared_ptr<Pizza>(new CheesePizza()); case PIZZA_TYPE_GREEK: return shared_ptr<Pizza>(new GreekPizza()); case PIZZA_TYPE_PEPPERONI: return shared_ptr<Pizza>(new PepperoniPizza()); default: return shared_ptr<Pizza>(new PepperoniPizza()); } }
};

测试代码

int _tmain(int argc, _TCHAR* argv[])
{shared_ptr<Pizza> cheesePizza = PizzaFactory::createPizza(PIZZA_TYPE_CHEESE); shared_ptr<Pizza> greekPizza = PizzaFactory::createPizza(PIZZA_TYPE_GREEK); shared_ptr<Pizza> pepperoniPizza = PizzaFactory::createPizza(PIZZA_TYPE_PEPPERONI);cheesePizza->MakePizza(); greekPizza->MakePizza(); pepperoniPizza->MakePizza(); return 0;
}

这样写好什么好处呢?

  1. .静态工厂方法统一管理对象的创建
  2. 静态工厂方法推迟了产品的实例化。

这样写的缺点是什么呢?

  缺点就是在增加新的类型时,需要修改工厂类。这违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是需要更高级的工厂方法模式。

2. 工厂方法模式

工厂方法模式: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

当然从代码的角度就是其实就是把 PizzaFactory 抽象出来,用子类来实现。

class PizzaFactory
{
public: PizzaFactory(){}; ~PizzaFactory(){};virtual Pizza* createPizza()  = 0;
};class PizzaFactoryCheese : public PizzaFactory
{
public:CheesePizza*    createPizza() { return new CheesePizza; }
}class PizzaFactoryGreek : public PizzaFactory
{
public:GreekPizza*    createPizza() { return new GreekPizza; }
}

注意:由于此时PizzaFactory的createPizza()为虚函数,因此不能使用static修饰符。

工厂方法模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

至此,貌似有简单工厂模式和工厂方法模式所有问题都可以应付了,但是,如果生意扩大了,除了Pizza又做Hamburger了,怎么办? 于是抽象工厂模式出现了。

3. 抽象工厂

抽象工厂和工厂方法的主要区别是工厂方法使用继承来创建对象,而抽象工厂是使用组合。

例子代码如下:

class Burger
{ public: Burger(){}; virtual ~Burger(){};virtual void MakeBurger() = 0;
};class KfcBurger : public Burger
{ public: KfcBurger (){}; ~KfcBurger (){};void MakeBurger()
{ cout << "make KFC Burget" <<endl;
}
};class McdBurger : public Burger
{ public: McdBurger (){}; ~McdBurger (){};void MakeBurger()
{ cout << "make McD Burget" <<endl;
}
};class CoreFactory
{virtual Pizza* MakePizza() = 0;virtual Burger* MakeBurger() = 0;
}class FactoryA : public CoreFactory
{public:Pizza* MakePizza() {return new CheesePizza;}Burger* MakeBurger() {return new KfcBurger;}
}class FactoryB : public CoreFactory
{public:Pizza* MakePizza() {return new GreekPizza;}Burger* MakeBurger() {return new McdBurger;}
}

转载于:https://www.cnblogs.com/haba/p/3415860.html

设计模式--工厂模式(c++)相关推荐

  1. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  2. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  3. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  4. 设计模式---工厂模式

    设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...

  5. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  6. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  7. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  8. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

  9. 设计模式-工厂模式(学习)

    设计模式-工厂模式(学习) 在程序的世界里,就像射雕英雄传一样,我们的技能就像是武功一样,我们只有不断去学习练习才能有机会像郭靖一样成为"天下第一". 我认为技能和武功是很类似的, ...

  10. 设计模式-工厂模式的3中不同实现[JAVA]

    设计模式-工厂模式的3中不同实现[JAVA] 工厂模式简介 In Factory pattern, we create object without exposing the creation log ...

最新文章

  1. IBM蓝色基因/Q将采用NAND闪存存储
  2. 掀起网络狂欢效应的六条金科玉律
  3. 按字寻址与按字节寻址
  4. 画验证曲线_数学老师用“函数曲线”绘出美图 学生舍不得擦
  5. HDU5322 - cdq分治FFT加速dp
  6. (2021) 23 [持久化] I/O设备与驱动
  7. 哐!英特尔的无人机砸中你头顶
  8. android checkboxpreference属性,如何更改android中CheckBoxPreference标题的文本颜色?
  9. STM32CUBEIDE USB下载总是连接不上 总是USBD_BUSY
  10. Drupal主题制作流程
  11. 恶意代码分析实战——反汇编
  12. 思科VLAN Trunk
  13. PS打造唯美冷色调照片
  14. push_back、emplace_back、std::move
  15. 计算机属性中只有远程协助,使用Windows自带的远程协助功能解决电脑问题
  16. 接口转换器故障与解决办法
  17. 计算机学科评估排名2020,2020哲学学科评估排名结果出炉及评估结果
  18. MyCat笔记(九):书籍:分布式数据库架构及企业实践-基于Mycat中间件.pdf
  19. Python股票行情看板
  20. Web 页面录屏实现

热门文章

  1. 异步回调发展(地狱回调)
  2. app测试--性能测试DDMS
  3. Windows10与Vmware配置Windowsserver2003共享磁盘
  4. Ubuntu普通用户使用串口设备
  5. 图像处理之基础---大话小波和卷积
  6. 对vector/string执行insert/erase操作后迭代器的情况说明
  7. 【数据科学】什么是数据分析
  8. 优先队列的优先级设置法
  9. 由有序序列折半查找构建判定树
  10. 解决 Failed to connect to github.com port 443:connection timed out