工厂方法模式_1天1个设计模式——工厂方法模式

意图

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

问题

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

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

解决方案

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

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

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

69f386349b3eb5d4bcad3ad19bed9f46.png

工厂方法模式结构

be887aff7bcb65080a898f4d492ed788.png
  • 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;}

该模式的优缺点

优点

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

缺点

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop简介(大数据技术)

Hadoop可运行于一般的商用服务器上&#xff0c;具有高容错、高可靠性、高扩展性等特点 特别适合写一次&#xff0c;读多次的场景 适合 大规模数据 流式数据&#xff08;写一次&#xff0c;读多次&#xff09; 商用硬件&#xff08;一般硬件&#xff09; 不适合 低延时的数据访问…

hive简介(大数据技术)

背景和概念 Hive是一个依赖于分布式存储的查询和管理大型数据集的数据仓库。传统的非大数据行业一般都是基于表进行数据存储和管理的&#xff0c;如果由于业务扩张或者其他原因迁移到HDFS平台上&#xff0c;那么需要将传统的SQL查询语句全部翻译成Map-reduce的程序实现&#xf…

kafka简介(大数据技术)

kafka是用于构建实时数据管道和流应用程序。具有横向扩展&#xff0c;容错&#xff0c;wicked fast&#xff08;变态快&#xff09;等优点&#xff0c;并已在成千上万家公司运行。 简单说明什么是kafka Apache kafka是消息中间件的一种&#xff0c;我发现很多人不知道消息中间件…

matlab晶闸管整流电路,采用Matlab/Simulink对三相桥式全控整流电路的仿真分析

本文利用Simulink对三相桥式全控整流电路进行建模&#xff0c;对不同控制角、桥故障情况下进行了仿真分析&#xff0c;既进一步加深了三相桥式全控整流电路的理论&#xff0c;同时也为现代电力电子实验教学奠定良好的实验基础。1 电路的构成及工作特点三相桥式全控整流电路原理…

flume简介(大数据技术)

1 .背景 flume是由cloudera软件公司产出的可分布式日志收集系统&#xff0c;后与2009年被捐赠了apache软件基金会&#xff0c;为hadoop相关组件之一。尤其近几年随着flume的不断被完善以及升级版本的逐一推出&#xff0c;特别是flume-ng;同时flume内部的各种组件不断丰富&#…

python开发学习笔记之六(面向对象)

面向对象引入&#xff1a; 现在有一个这样的需求&#xff1a;做汽水。 在之前的学习中&#xff0c;我们怎样处理这种类似的问题呢&#xff1f;思考一下&#xff0c;哦&#xff0c;不就是分步骤做嘛&#xff0c;把复杂的问题简单化&#xff0c;分成一个一个的步骤&#xff0c;就…

NAT地址转换

2017年1月12日, 星期四NAT地址转换SNAT&#xff1a;源地址转换DNAT&#xff1a;目标地址转换null转载于:https://www.cnblogs.com/jxhd1/p/9521173.html

修改小程序swiper 点的样式_高质量的微信小程序样式模板应该长什么样?

现在不懂技术的小白若想快速制作自己的小程序&#xff0c;一般是通过小程序模板来实现。通过在模板上添加自己的图片、文字、商品等等&#xff0c;可以很简单地生成一个小程序。不过要想把小程序做得好看&#xff0c;你得找高质量的小程序样式模板才行。那么高质量的微信小程序…

impala简介(大数据技术)

一、Impala概述 什么是Impala&#xff1f; Impala是用于处理存储在Hadoop集群中的大量数据的MPP&#xff08;大规模并行处理&#xff09;SQL查询引擎。 它是一个用C 和Java编写的开源软件。 与其他Hadoop的SQL引擎相比&#xff0c;它提供了高性能和低延迟。 换句话说&#xf…

猎豹网matlab视频百度云,猎豹网校C++ Primer初级全套视频教程

1_CppPrimer_快速入门2_CppPrimer_基本内置类型3_CppPrimer_习题解答_2-34_CppPrimer_字面值常量5_CppPrimer_变量6_CppPrimer_变量名7_CppPrimer_定义对象8_CppPrimer_声明和定义9_CppPrimer_名字的作用域10_CppPrimer_const限定符11_CppPrimer_引用12_CppPrimer_typedef13_Cp…

Linux 监控数据库资源占用

1.用xshell连接远程服务器&#xff0c;登录用户名和密码 2.进入远程服务器 3.输入top&#xff0c;回车&#xff0c;显示如下图所示 4.Cpu states: cpu状态 0&#xff0c;2&#xff0c;4&#xff0c;6 说明cpu是四核的 IDLE 代表闲置CPU百分比 百分号前面数字越大&#xff…

windows下python安装

第一步&#xff1a;下载Python安装包 在Python的官网 www.python.org 中找到最新版本的Python安装包&#xff0c;点击进行下载&#xff0c;请注意&#xff0c;当你的电脑是32位的机器&#xff0c;请选择32位的安装包&#xff0c;如果是64位的&#xff0c;请选择64位的安装包&am…

ssdp协议_Cotopaxi:使用指定IoT网络协议对IoT设备进行安全测试

cotopaxi是用于IoT设备安全测试的工具集。你可以指定IoT网络协议(如CoAP&#xff0c;DTLS&#xff0c;HTCPCP&#xff0c;mDNS&#xff0c;MQTT&#xff0c;SSDP)进行测试。安装只需从git克隆代码即可&#xff1a;https://github.com/Samsung/cotopaxi要求目前Cotopaxi仅适用于…

实例1:python

#有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; #!/usr/bin/python -- coding: UTF-8 -- for i in range(1,5): for j in range(1,5): for k in range(1,5): if( i ! k ) and (i ! j) and (j ! k…

unit类型是什么?_项目中有用过锁吗?能解释一下什么是AQS(AbstractQueuedSynchronizer)吗?...

1 前言 锁是用来控制多个线程访问共享资源的方式&#xff0c;一般来说&#xff0c;一个锁能防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源&#xff0c;如读写锁)。在以前&#xff0c;Java程序是靠synchronized来实现锁功能的&#xff0c;而在Jav…

递归树

用于可视化递归算法的流程。当你知道递归的时间复杂度的公式后&#xff0c;就可以画出递归树&#xff0c;有利于你计算递归算法的时间复杂度。 像这种公式&#xff0c;第一个2说明是二叉树&#xff0c;一分为2&#xff1b;第二个n/2&#xff0c;说明他的儿子们所占用的数据只有…

实例1:python(续)

#有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; d[] for a in range(1,5): for b in range(1,5): for c in range(1,5): if (a!b) and (a!c) and (c!b): d.append([a,b,c]) print (“总数量&#xf…

实例2:python

#企业发放的奖金根据利润提成。利润(I)低于或等于10万元时&#xff0c;奖金可提10%&#xff1b;利润高于10万元&#xff0c;低于20万元时&#xff0c;低于10万元的部分按10%提成&#xff0c;高于10万元的部分&#xff0c;可提成7.5%&#xff1b;20万到40万之间时&#xff0c;高…

java快速排序直观演示代码,排序算法总结(含动图演示和Java代码实现)

本文将围绕冒泡排序、桶排序、计数排序、堆排序、插入排序、并归排序、快速排序和选择排序&#xff0c;按照描述、时间复杂度(最坏情况)、动态图展示和代码实现来讲解。本文默认排序为从小到大。本文相关代码已上传至github&#xff0c;欢迎关注https://github.com/zhuzhenke/c…

scrapy ip地址 tcp time out_TCP的运作流程(一)——“三次握手”

前言看过前面有关两篇HTTP的文章的同学&#xff0c;想必对HTTP已经有了一定的了解。在HTTP初始(一)中提到过TCP/IP四层网络模型&#xff0c;这次我们就来详细了解一下TCP传输。因为时间和篇幅所限&#xff0c;本篇讲分为两章&#xff0c;本章讲TCP的三次握手&#xff0c;下章讲…