1.概述

使用设计模式可以提高代码的可复用性、可扩充性和可维护性。工厂方法模式(Factory Method Pattern)属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。

在前面的设计模式(4)—— 简单工厂模式中我们介绍了简单工厂模式,接下来将介绍下工厂方法模式,它同样是创建型设计模式,有相似之处,但又有些不同,文章的末尾会介绍他们之间的不同。

这里借用一下网上的资源,类图结构如下:

基类:抽象产品类。
子类:具体产品类。
工厂类:即抽象工厂类,提供了一个创建对象的方法,也称为“工厂方法”,该方法返回一个具体产品类的对象。
子类工厂:具体工厂类,实现抽象工厂类的“工厂方法”,来创建某个具体产品类实例。每一个子类工厂,负责创建一个具体产品类的对象。

2.工厂方法模式具体应用

请参考设计模式(4)—— 简单工厂模式这篇文章。 还是以生产比萨为例,比萨店需要根据客户订单,生产不同口味的比萨。这里比萨生产不是交由一个厨房生产,而是不同口味比萨交由不同厨房来专门制作。

以 C++ 为例,首先实现我们的抽象比萨类和具体口味的比萨。

class Pizza {
public:virtual string getDescription() = 0;
};//蛤蜊比萨
class ClamPizza :public Pizza {string name="蛤蜊比萨";
public:string getDescription() {return name + " 价格45元";}
};//素食比萨
class VeggiePizza :public Pizza {string name = "素食比萨";
public:string getDescription() {return name + " 价格26元";;}
};//芝士比萨
class CheesePizza :public Pizza {string name = "比萨";
public:string getDescription() {return name + " 价格38元";;}
};

下面实现抽象工厂和制作不同口味比萨的厨房。

//抽象工厂,提供创建创建对象的接口createPizza()
class PizzaFactory {
public:virtual Pizza* createPizza() = 0;
};//具体工厂类,创建蛤蜊比萨
class ClamPizzaFactory :PizzaFactory {
public:virtual Pizza* createPizza() {return new ClamPizza;}
};//具体工厂类,创建素食比萨
class VeggiePizzaFactory :public PizzaFactory{
public:virtual Pizza* createPizza() {return new VeggiePizza;}
};//具体工厂类,创建芝士比萨
class CheesePizzaFactory :public PizzaFactory {
public:virtual Pizza* createPizza() {return new CheesePizza;}
};

下面开始生产我们需要的比萨。

int main() {Pizza* clamPizza = (new ClamPizzaFactory)->createPizza();   //实例化蛤蜊比萨cout<<clamPizza->getDescription()<<endl;Pizza* veggiePizza = (new VeggiePizzaFactory)->createPizza();   //实例化素食比萨cout << veggiePizza->getDescription() << endl;Pizza* cheesePizza = (new CheesePizzaFactory)->createPizza();   //实例化芝士比萨cout << cheesePizza->getDescription() << endl;
}

程序输出结果:

蛤蜊比萨 价格45元
素食比萨 价格26元
比萨 价格38元

工厂方法模式实现也比较简单,上面的类结构图如下所示:

3.简单工厂和工厂方法模式的比较

简单工厂模式:
专门定义一个工厂类负责创建其他类的实例,最大的优点在于工厂类中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类。其缺点就是生产新产品时需要更改简单工厂类的代码,这违背了开放封闭原则。

工厂方法模式:
提供创建对象的接口,让子类去决定具体实例化的对象,把简单的内部逻辑判断移到了客户端代码。工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点。

下一篇将讲解抽象工厂模式,并与二者进行对比。

4.小结

(1)工厂方法模式属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。
(2)工厂方法模式坚持了依赖倒置原则,高层模块不依赖于底层模块,二者都依赖于抽象。高层模块是比萨店前台,底层模块是具体口味的披萨,二者都依赖抽象类 Pizza。


参考文献

[1] 简单工厂模式和工厂方法模式

设计模式(5)—— 工厂方法模式(Factory Method,创建型)相关推荐

  1. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  2. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  3. 设计模式之工厂方法模式---factory method

    模式的介绍 模式的定义 Define an interface for creating an object,but let subclassed decide which class to inst ...

  4. 设计模式之工厂方法模式(Factory Method Pattern)

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

  5. 设计模式题目-工厂方法模式(Factory Method)

    设计一个程序来读取多种不同存储格式的图片,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF格式图片读取器(GifReader)用于读取GIF格式的图片,JPEG格式图片读取器 ...

  6. 工厂方法模式(Factory Method)简介

    工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...

  7. 设计模式之六:工厂方法模式(Factory method Pattern)

    工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象 ...

  8. 浅谈C++设计模式之工厂方法(Factory Method)

    为什么要用设计模式?根本原因是为了代码复用,增加可维护性. 面向对象设计坚持的原则:开闭原则(Open Closed Principle,OCP).里氏代换原则(Liskov Substitution ...

  9. 软件工程 - 设计模式学习之工厂方法模式Factory Method

    在现实生活中我们可以看见,乐事在卖薯片,可比克也在卖. 我敢肯定的说它们各自都有自己的工厂来生产薯片,而且生产出来的薯片味道还是不一样的. 这就是我们这里所谓的工厂方法模式. 我们来看看这个模式的UM ...

  10. C++实现工厂方法模式Factory Method Pattern

    设计原则6:要依赖抽象,不要依赖具体类.(又称依赖倒置原则Dependency Inversion Principle) 不能让高层组件依赖低层组件,而且,不管高层组件或低层组件,两者都应该依赖于抽象 ...

最新文章

  1. jquery $.proxy使用 Jquery实现ready()的源码
  2. SQLSERVER2005登录时出错
  3. ADO.NET Entity Data Model入门实例
  4. 香农定理和奈奎斯特定理区别_这一切都从指数函数开始(4)——采样定理
  5. 站立会议-2014-04-14
  6. SAP Spartacus outlet.directive.ts里this.templateRef的来源
  7. TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)...
  8. vue2+node+mysql demo总结
  9. 如何在data visualization 中update svg_如何操作小程序页面中data数据区中的数据
  10. 关于解决MyEclipse的耗内存的办法
  11. java异常网,Java异常实践事项
  12. android studio 打包生成apk文件
  13. ARM资源免费下载——超级全面,力荐
  14. 2017年全球IDC、光器件、100G及400G数通模块市场预测
  15. 【数据结构:树】——搜索二叉树-K模型(非递归和递归)
  16. 微信支付报错提示“商户号该产品权限未开通,请前往商户平台产品中心检查后重试...
  17. 宏观经济学-大题资源整理
  18. iPad屏幕不亮但是有声音
  19. STM32DAC输出遇到的问题
  20. 乡郎桑黄:什么是桑黄?桑树的价值有哪些?

热门文章

  1. 移动互联网新协议 GTP 中被曝多个高危漏洞,影响4G和5G 用户
  2. GPU产品源代码被盗?AMD 证实称仅为测试文件
  3. Python进阶三部曲网络编程
  4. Scala---Import子句详解
  5. 细数被程序员吐糟的9大困难(转)
  6. Undefined symbols for architecture i386:问题解决
  7. ACM算法书籍推荐zz
  8. 本地socket通讯 -转
  9. L2-015. 互评成绩-PAT团体程序设计天梯赛GPLT
  10. 车rc陀螺仪测试软件,利用加速度计和陀螺仪测量车辆运动