意图

工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

问题

假设你正在开发一款物流管理应用。1.0版本只能支持处理卡车运输,因此大部分的代码都位于名为Truck的类中。随着业务越来越广泛,该应用需要支持处理轮船运输。但是,由于大部分的代码都在Truck类中,那么添加Ship类则需要修改全部代码。

更糟糕的是,每添加一种新的运输方式,就需要对代码进行一次大规模的修改。心力憔悴啊。

解决方案

工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用 (即使用 new运算符)。*(对象仍将通过 new运算符创建, 只是该运算符改在工厂方法中调用罢了。 )*工厂方法返回的对象通常被称作 “产品”。

我们通过在子类中重写工厂方法,来改变返回产品的类型。但是,只有当产品具有共同的接口时,子类才能返回不同类型的产品,且基类中的工厂方法还将返回类型声明为这一共有接口。

利用工厂方法,对问题提出解决方案,类图如下:

工厂方法模式结构

  • Product:所有产品的共有接口。
  • Concrete Products:具体产品,对Product接口的不同实现
  • Creator:创建者声明了返回产品对象的工厂方法。 该方法的返回对象类型必须与Product接口相匹配。注意,创建者类包含一些与产品相关的核心业务逻辑。
  • Concrete Creators:将会重写基类工厂方法, 使其返回不同类型的具体产品。

对问题的代码实现

#includeusing namespace std;// 产品接口中将声明所有具体产品都必须实现的操作。class Transport {public:~Transport(){}virtual void delivery() const = 0;//不同具体产品对此进行不同实现};// 具体产品需提供产品接口的各种实现。class Truck : public Transport{public:virtual void delivery() const{cout << "卡车:通过盒子运输" << endl;}};class Ship : public Transport {public:virtual void delivery() const{cout << "轮船:通过集装箱运输" << endl;}};// 创建者类声明的工厂方法必须返回一个产品类的对象。创建者的子类通常会提供// 该方法的实现。class Logistics {public:~Logistics(){}//基类工厂方法,返回类型声明为产品共有接口virtual Transport* createTransport() const = 0;// 请注意,创建者的主要职责并非是创建产品。其中通常会包含一些核心业务// 逻辑,这些逻辑依赖于由工厂方法返回的产品对象。子类可通过重写工厂方// 法并使其返回不同类型的产品来间接修改业务逻辑。void plan_delivery() const{//调用工厂方法创建一个产品对象Transport* tran = createTransport();//使用产品tran->delivery();delete tran;}};// 具体创建者将重写工厂方法以改变其所返回的产品类型。class RoadLogistics :public Logistics {public:virtual Transport* createTransport() const{return new Truck();}};class SeaLogistics :public Logistics {public:virtual Transport* createTransport() const {return new Ship();}};//客户端代码void ClientCode(const Logistics* log) {cout << "开始运输:";log->plan_delivery();}int main() {cout << "APP:以卡车运输" << endl;Logistics* log1 = new RoadLogistics();ClientCode(log1);cout << endl;cout << "APP:以轮船运输" << endl;Logistics* log2 = new SeaLogistics();ClientCode(log2);delete log1;delete log2;return 0;}

该模式的优缺点

优点

  • 避免创建者和具体产品之间的紧耦合
  • 符合单一职责原则。将产品创建代码放在程序的单一位置,从而使代码易于维护
  • 符合开闭原则。无需更改现有客户端代码,就可以在程序中引入新的产品类型

缺点

  • 工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中。

工厂方法模式_1天1个设计模式——工厂方法模式相关推荐

  1. java 工厂模式的写法_[java设计模式] 工厂模式解析

    什么是工厂模式? 我的总结是: 遵守软件设计中的开闭原则和依赖反转原则, 并且客户端只需通过参数来创造多个对象, 并且在创建过程中,创建对象的过程对客户端是透明的. 这种开发模式叫做工厂模式. 出现原 ...

  2. python中代理模式分为几种_Python设计模式之代理模式实例详解

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...

  3. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  4. java备忘录模式 类图,【java设计模式】备忘录模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...

  5. java备忘录模式 类图,Android编程设计模式之备忘录模式详解

    本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时 ...

  6. java实现责任链模式_我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  7. 建造者模式 php,螃蟹学PHP设计模式之建造者模式

    2.建造者模式 螃蟹今天要学习建造者模式了,昨天的适配器记得还是很清楚的.对于建造者模式,螃蟹的理解是你有10部iphone手机要充电,假设充电器额定电压都是220v,但是外电压不稳定,可能是220v ...

  8. 访问者模式的java语言_Java 设计模式 之 访问者模式

    package com.visit.theory; import java.util.ArrayList; public class Test { public static void main(St ...

  9. java备忘录模式 类图,折腾Java设计模式之备忘录模式

    备忘录模式 Without violating encapsulation, capture and externalize an object's internal state allowing t ...

最新文章

  1. Windows魔法堂:解决“由于启动计算机时出现页面文件配置问题.......”
  2. Tungsten Fabric SDN — 流量调试手段
  3. mysql 同样字段的索引_MySQL表中具有相同字段的两个索引
  4. python语法大全-总结了Python中的22个基本语法
  5. 第03课:Anaconda 与 Jupyter Notebook
  6. Facebook田渊栋谈人生挑战与选择
  7. php 记录报错,php报错自己记录
  8. 无效内卷正在毁掉年轻一代程序员
  9. 本地可以使用oracle吗,Oracle - PLS-00642:SQL语句中不允许使用本地集合类型
  10. pytorch-alexnet-推理
  11. ZABBIX 监控 JBOSS 7.1.1
  12. 计算机图形学 全局光照及方法,实时全局光照渲染研究
  13. html中b和strong的区别,i和em的区别
  14. 为什么滴滴裁员2000人,被裁员工却像中奖一样开心?...
  15. android 更改主题,如何更改android app的颜色主题?
  16. Python爬虫——selenium模拟京东网站登录(一)
  17. java基础(个人笔记)
  18. 分享一个好用的CSS布局
  19. 一篇文章读懂少儿机器人编程课程学什么?
  20. 学会这个删库再也不用跑路了~ --技术流ken

热门文章

  1. Windows安装Python包下载工具pip遇到的问题
  2. 【C语言】01-C语言概述
  3. NFC 验证平台搭建
  4. FutureTask isDone 返回 false
  5. Easyui笔记:jquery执行append后input的验证失效解决方案
  6. windows系统停止8080端口
  7. RedisTemplate在项目中的应用
  8. ubuntu远程连接windows工具rdesktop
  9. js中小数取整数(向上、向下取整数,四舍五入取整数的实现)
  10. mybatis plus 新增,修改