【设计模式 01】简单工厂模式(Simple factory pattern)

简单工厂模式

可以根据参数的不同返回不同类的实例

参考:

  • CSDN|简单工厂模式

简单工厂通过传给工厂类的参数的不同,返回不同的对象,包括三部分组成:

  1. 具体的”产品“
  2. 工厂类(实例化并返回”产品“)
  3. 客户端(使用”产品“)

为什么使用简单工厂:

  1. ”产品“的创建过程可能很复杂,涉及到多个不同类之间的依赖,通过简单工厂将创建过程隐藏在工厂类中,一方面减轻了客户端使用该产品的难度,另一方面也防止了客户端错误创建产品造成的安全问题。
  2. 将产品的生产和消费过程分离开,这样如果要有了一个新的产品,只需要把它加入到工厂类中,客户端需要时工厂类就会返回给它,否则的话,每次添加一个新的产品,都需要修改客户端代码,违反开闭原则。

简单工厂的缺点:

  1. 系统过度依赖工厂类,工厂类作为一个”上帝类“,负责创建客户端需要的所有对象,导致一旦工厂类出错,整个系统就会崩溃。
  2. 如果”产品类“特别多,工厂类中就会有很多个分支,造成工厂类异常庞大,难以维护。
  3. 每次添加新的产品都要修改工厂类,从工厂类的角度看违反了”开闭原则“,也不利于系统拓展。
  4. 工厂方法一般是静态方法,不利于继承。

适用场景

  1. 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

  2. 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

例:

如果需要获取不同的手机对象,就可以使用简单工厂,具体的手机对象依赖于CPU, Camera等,通过简单工厂的封装,客户端获取 Phone 对象时就不需要了解具体的 ”生产过程“了.

实例化CPU, Camera 等配件时,也应该使用简单工厂。

UTOOLS1589370322613.png
package pers.junebao.simple_factory;import pers.junebao.simple_factory.fitting.*;
import pers.junebao.simple_factory.phone.Honor;
import pers.junebao.simple_factory.phone.OnePlus;
import pers.junebao.simple_factory.phone.Phone;public class PhoneFactory {/*** 一个用来产生 Phone 对象的工厂方法* @param name 根据 name 产生不同的 Phone 的子类对象* @return 返回实例化后的对象,name 不匹配返回 null*/public static Phone getPhone(String name) {if(name.toLowerCase().equals("oneplus")){// TODO:使用简单工厂重构CPU cpu = new Qualcomm();Camera camera = new Sony();return new OnePlus(cpu, camera);} else if (name.toLowerCase().equals("honor")) {CPU cpu = new Kirin();Camera camera = new Leica();return new Honor(cpu, camera);} else {return null;}}
}
package pers.junebao.simple_factory;import pers.junebao.simple_factory.phone.Phone;public class Consumer {public static void main(String[] args) {Phone phone = PhoneFactory.getPhone("Honor");assert phone != null;phone.printConfig();}
}

GitHub | 完整代码

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

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

相关文章

[Hadoop]MapReduce多路径输入与多个输入

1. 多路径输入 FileInputFormat是所有使用文件作为其数据源的 InputFormat 实现的基类,它的主要作用是指出作业的输入文件位置。因为作业的输入被设定为一组路径, 这对指定作业输入提供了很强的灵活性。FileInputFormat 提供了四种静态方法来设定 Job 的…

pvrect r语言 聚类_R语言实现KEGG通路富集可视化

用过KEGG的朋友应该都很熟悉里面的通路地图。你是否想过如果自己可以控制通路图将自己的基因绘制在一个通路图中,那么今天给大家介绍一个新推出的Bioconductor软件包pathview。这个包可以进行KEGG富集分析。首先,我们不耐烦的介绍下Bioconductor包的安装…

【设计模式 02】策略模式( Strategy)

策略模式 参考: CSDN | 策略模式百家号 | 策略模式 如果某个系统需要不同的算法(如超市收银的优惠算法),那么可以把这些算法独立出来,使之之间可以相互替换,这种模式叫做策略模式,它同样具有三个…

PL/SQL复合变量

复合变量可以将不同数据类型的多个值存储在一个单元中。由于复合类型可以由用户自己根据需要定义其结构,所以复合数据类型也称为自定义数据类型。在PL/SQL中,使用%TYPE声明的变量类型与数据表中字段的数据类型相同,当数据表中字段数据类型修改…

Android中使用am命令实现在命令行启动程序详解

在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码代码如下:usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging send a broadcast Intent: am br…

用Visual Studio 2019连接 WSL来编译调试C/C++项目

因为有作业要在Linux环境下写,用虚拟机直接卡成PPT,VS code又不会调试,就搞一下VS 2019吧。 环境 windows 10 WSL(Ubuntu 18.04.4) Visual Studio Community 2019 Linux 里要有C/C环境(gcc等)VS要有 适用于 Linux…

node.js Websocket消息推送---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支…

git 移动分支指针_理解git 中的HEAD指针branch指针

HEAD指针使用git checkout 来移动HEAD指针,移动的对象可以是分支指针也可以是快照。HEAD指针可以指向快照也可以指向branch。当指向branch时提交后会和branch指针一起向后移动,当不指向branch提交时时则会在一个detached状态。分支(branch)指针使用git b…

应用程序域

好文链接 使用.NET建立的可执行程序 .exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。应用程序域是.NET引入的一个新概念,它比进程所占用的资源要少,可以被看作是一个轻量级的进程。 …

【设计模式 03】装饰模式——俄罗斯套娃?

装饰模式(俄罗斯套娃?) 装饰模式:动态的给某些对象添加额外的功能 参考: 简书 | 装饰模式 博客园 | 简说设计模式——装饰模式 博客园 | 装饰器模式 Decorator 结构型 设计模式 (十) 什么是装饰模式 装饰模式也叫装饰器模式,p…

系统移植的四大步骤

最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时…

bem什么意思_bem是什么意思_bem的翻译_音标_读音_用法_例句_爱词霸在线词典

全部Methods Three different concentrations of the n - butanol extract of MOH ( BEM ) : 0.038 g L ~ ( - 1 ), 0.11 g L ~ ( - 1 ) and 0.34 g L ~ ( - 1 ) were prepared.巴戟天醇提取物 ( BEM ) 配成含生药0.038gL~ ( -1)、0.11gL~ ( -1 ) 、 0.34gL~ ( -1 ) 三种浓度…

display:flex

flex:弹性布局 常用属性介绍: flex-direction: column (设置主容器主轴方向) flex-flow: row wrap (第一个参数为flex-direction,第二个为flex-wrap) align-items: flex-start (设…

Linux(Ubuntu 19.10)下 Qt5 连接 MySQL(QMYSQL driver not loaded)

Linux(Ubuntu 19.10)下 Qt5 连接 MySQL 安装好 MySQL 和 Qt Qt 连接 MySQL 的代码 QSqlDatabase dQSqlDatabase::addDatabase("QMYSQL");//加载mysql驱动,这个字符串是固定的 d.setHostName("127.0.0.1"); d.setDatabas…

华为消息推送 有透传通道吗_求解在推送用透传消息-使用厂商通道(我用的是基座测试) 用手机测试出现了“clientId离线”问题...

// #ifdef APP-PLUS// uni.showModal({// title: 提示,// content: 您的用户在其它的app登录,如果有问题,请修改密码或重新登录!,// cancelText:"修改密码",// confirmText:"好的",// success: function (res) {// if (r…

oneuijs/You-Dont-Need-jQuery

oneuijs/You-Dont-Need-jQuery https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh-CN.mdYou Dont Need jQuery 前端发展很快,现代浏览器原生 API 已经足够好用。我们并不需要为了操作 DOM、Event 等再学习一下 jQuery 的 API。同时由于 React…

Wpf 数据绑定简介、实例1

简介:1.WPF绑定使用的源属性必须是依赖项属性,这是因为依赖项属性具有内置的更改通知支持,元素绑定表达式使用了Xaml扩展标记, WPF绑定一个控件是使用Binding.ElementName, 绑定非控件对象时使用Source,RelativeSource,DataContex…

【设计模式 04】代理模式

代理模式 代理模式( Proxy):为其他对象提供一种代理以控制对这个对象的访问。 参考:refactoringguru | proxy 什么是代理模式 有时候如果想要访问某个对象,但又没办法直接访问或不方便直接访问,可以使用代理模式,代理…

css 大于号 标签_CSS设计基础选择器篇

点击上方 Java项目学习 ,选择 星标 公众号重磅资讯、干货,第一时间送达前言:如果将CSS样式应用于特定的网页对象上,需要先找到目标元素。在CSS样式中执行这一任务的部分被称为选择器。1 标签选择器优点:为页面中同类型…

CSDN博客投票活动开始了

自己坚持写博客,一方面是为了将自己对知识点的理解做一个总结,另一方面也是因为自己看到了很多无私奉献分享自己知识的小伙伴们,因此自己也想像他们那样尽自己微薄之力把自己对某一知识点的理解分享给大家,或许算不上什么特高级的…