设计模式 工厂方法_使用工厂方法模式设计最佳实践

设计模式 工厂方法

在前面的“设计模式”示例中,我们解释了当今常用的“工厂”模式。 在本节中,我们将了解具有更多抽象的更高级的解决方案。 该模式称为工厂方法设计模式。

定义:
Factory方法模式提供了一种用于创建对象的方法,但是将对象创建委托给了子类。 工厂方法设计模式以类似于工厂模式的方式解决了这些问题,并附加了抽象级别。

可以使用new关键字实例化该对象。 例如,对象A使用以下方法创建另一个对象B:

ClassB objB = new ClassB();

因此,对象A拥有对对象B的引用。

对象实例化对象实例化

由于对象A现在依赖于对象B(如果后来对其进行了修改),那么我们将不得不重新编译对象A。 对象的创建可能更加复杂,如果存在更多的耦合,那么维护将是软件开发中一项痛苦而昂贵的工作。

为了避免这种最坏的情况,我们提供了新颖的设计模式来进行救援。 他们试图在客户端和对象创建者之间创建松散的耦合,并为开发者提供其他一些设计优势。 Factory Method模式就是解决设计问题的一种模式。

常用:
工厂方法设计模式通常与装饰器设计模式一起用于各种框架(例如Struts,Spring,Apache)中。 有许多基于此Factory模式的J2EE模式,例如DAO模式。

让我们以服装工厂为例,我们正在创建各种类型的服装,但是客户完全不知道这些产品是如何创建的。 即使我们必须添加新的服装类型(例如夹克),也无需更改客户端代码,从而增加了应用程序的灵活性。

工厂模式类图

何时使用工厂方法模式?

  • 对象的创建需要代码的重用,而无需大量重复代码。
  • 一个类将不知道需要创建哪些子类。
  • 子类可以指定应创建哪些对象。
  • 父类将把对象的创建委托给它的子类。

结构体

下图突出显示了工厂方法设计模式的典型结构。 与上述示例不同,已添加了一个附加的Factory Abstract(Factory)类。

工厂方法设计模式(UML)

在上图中,以下是参与者:

  • 产品:这为工厂方法创建的对象定义了一个接口。
  • 具体产品:实现产品接口。
  • 工厂(创建者):这是一个抽象类,定义了返回产品对象的工厂方法。
  • 具体工厂:此类实现并覆盖由父工厂类声明的方法。

客户(例如,对象类A)将要使用由ConcreteFactory类(对象类B)创建的产品。 但是,在这种情况下,客户端仅持有对接口B的引用,而不是对象“类B”,因此它不需要了解有关类B的任何信息。 实际上,可以有多个类可以实现抽象类。

Factory Method模式允许子类决定实例化哪个类的含义是什么?
从根本上讲,这意味着对工厂抽象类进行编码,而无需知道将实例化哪些实际的ConcreteProduct类,即它是Trouser还是Shirt。 这完全由ConcreteFactory类确定。

现在,将上述模式实现到我们的GarmentFactory示例中。

工厂方法示例

让我们开始吧。 我们不会重复在Factory Pattern文章中找到的具体产品的代码,例如Shirt.java和Trouser.java。

已创建一个面向客户的新Factory抽象类。

public abstract class Factory {protected abstract GarmentType createGarments(String selection);}

需要修改GarmentFactory类以继承抽象类Factory。

public class GarmentFactory extends Factory{public GarmentType createGarments(String selection) {if (selection.equalsIgnoreCase('Trouser')) {return new Trouser();} else if (selection.equalsIgnoreCase('Shirt')) {return new Shirt();}throw new IllegalArgumentException('Selection doesnot exist');}
}

客户端类引用Factory类,并对Factory的createGarments(selection)方法进行分类,以在运行时创建产品。

Factory factory = new GarmentFactory();
GarmentType objGarmentType = factory.createGarments(selection);
System.out.println(objGarmentType.print());


优点:

  • 通过将对象创建从客户端代码移到Factory类及其子类,代码可以灵活,松耦合和可重用。 由于异议创建是集中的,因此维护此类代码更加容易。
  • 客户代码仅处理产品接口,因此可以在不修改客户代码逻辑的情况下添加任何具体产品。
  • Factory Method的优点是它可以多次返回相同的实例,或者可以返回子类而不是该确切类型的对象。
  • 它通过工厂创建对象来鼓励代码的一致性,该工厂强制执行每个人都必须遵循的一组明确规则。 这样可以避免在不同的客户端使用不同的构造函数。


例:

JDBC是这种模式的一个很好的例子。 应用程序代码不需要知道它将与哪个数据库一起使用,因此它也不知道应使用哪个特定于数据库的驱动程序类。 相反,它使用工厂方法来获取Connections,Statement和其他对象。 这提供了更改后端数据库的灵活性,而无需更改您的DAO层。
以下是SDK中的一些示例:
valueOf()方法,返回由工厂创建的对象,该对象与传递的参数值相等。 getInstance()方法,该方法创建Singleton类的实例。 newInstance()方法,该方法用于每次调用时从工厂方法创建和返回新实例。 下载示例代码

参考: Idiotechie博客上来自JCG合作伙伴 Mainak Goswami的使用Factory Method Pattern设计最佳实践 。

翻译自: https://www.javacodegeeks.com/2012/10/design-best-practices-using-factory-method-pattern.html

设计模式 工厂方法

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

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

相关文章

C Programming Language

代做module作业、代做C/C编程设计作业、代写Programming Language作业、代做C/C课程设计作业C Programming LanguageContribution to module (weighting: 20 %)1st Semester 2018-2019Out: WED. 5th Dec. 2018 Due: 18:00[GMT], WED. 19th Dec. 2018Main objective of the assi…

python修改列表中字典内的值_python修改字典内key对应值的方法

python学习笔记:字典python版本:Python 2.6.6系统环境:CentOS release 6.2 x86_64本文参考了互联网上前辈的一些文章一、字典是python中最灵活的内置数据结构类型,如果把列表看作是有序的对象集合,那么字典就是无序的集…

MATLAB使用技巧

1、ctrl c 或者 ctrl break 强行中断程序运行 2、变量X 右键save as为DX后,再次使用时load有区别:load(DX.mat) 得到的是X这个变量,直接出现在workspace里;Xnew load(DX.mat)得到的是一个名称为Xnew的结构体,里面包含…

Beta 冲刺 (2/7)

团队信息 队名:爸爸饿了组长博客:here作业博客:here组员情况 组员1(组长):王彬 过去两天完成了哪些任务 完成考试确定历史记录页面与排行榜页面的前端页面风格接下来的计划 & 还剩下哪些任务 各个食堂平…

您真的需要instanceof吗?

使用instanceof是一种代码味道。 我认为我们可能对此表示同意。 每当我看到这样的构造时,我肯定会出现问题。 也许有人只是在进行更改时没有注意到问题? 也许有一个主意,但是它太复杂了,以至于需要太多的精力或时间才能让开发人员…

python 累积正态分布函数_Python编程基础—Python语句书写规范

Python语句中没有专门的“结束符”。Python解释器不是根据"结束符"来判断语句是否结束,而是根据语法的完整性来判断。一、Python语句编写规则①通常是一行一句x1 1 x2 2 x3 3 print(x1,x2,x3)②也可以一行多句,用语句分隔符“;”对两个语句进行标识x1 …

MATLAB批量改变图片大小

%2018年6月28日11:07:15 %把一个目录下的图片缩放到指定大小 clc clear ratio 0.2;%缩放比例 cd(F:\数据集\crumpled clothes\cloth3\original image\);%不加这句话找不到图片 dpath F:\数据集\crumpled clothes\cloth3\original image\*.JPG;%找到路径下所有格式为.JPG的文件…

基于Libevent的HTTP Server

简单的Http Server 使用Libevent内置的http相关接口&#xff0c;可以很容易的构建一个Http Server&#xff0c;一个简单的Http Server如下&#xff1a; #include <event2/event.h> #include <event2/buffer.h> #include <event2/http.h> #include <Winso…

python写入数据的一种措施_Python 文件数据读写的具体实现

文件数据读写读写文件&#xff0c;本质上是请求操作系统打开一个文件对象&#xff0c;然后&#xff0c;通过操作系统提供的接口从这个文件对象中读取数据(读文件)&#xff0c;或者把数据写入这个文件对象(写文件)。文件读取使用 Python 内置 open() 函数&#xff0c;以 rt 的模…

MATLAB的dir函数

1、作用获得指定文件夹下的所有子文件夹和文件,并存放在在一种文件结构体数组中. 2.使用方法dir(.)列出当前目录下所有子文件夹和文件dir(G:\Matlab)列出指定目录下所有子文件夹和文件dir(G:\Matlab\*.jpg)列出当前目录下符合正则表达式的文件夹和文件3.例如&#xff1a;列出文…

libevent简介和使用

libevent是一个基于事件触发的网络库&#xff0c;memcached底层也是使用libevent库&#xff0c;今天学习下。总体来说&#xff0c;libevent有下面一些特点和优势&#xff1a;* 统一数据源&#xff0c; 统一I/O事件&#xff0c;信号和定时器这三种事件&#xff1b;* 可移植&…

qr码生成_从Java程序生成QR码图像

qr码生成如果您精通技术和小工具&#xff0c;则必须了解QR码。 这些天&#xff0c;到处都可以找到它-在博客&#xff0c;网站&#xff0c;甚至在某些公共场所。 这在移动应用程序中非常流行&#xff0c;在移动应用程序中&#xff0c;您可以使用QR Code扫描仪应用程序扫描QR Cod…

jracdrive变频器说明书580_jracdrive变频器err02

A&#xff1a;高性能密封型变频器-防粉尘、防水、防油污、防腐蚀此款高性能变频器&#xff0c;因为其具有防粉尘、防水、防油污、防腐蚀性能&#xff0c;适用于化工厂、印染厂、化纤厂、纺织厂、输送带、机床、水泥厂、制*厂、食品厂等环境恶劣的场合。变频器硬件特点&#xff…

Harris角点检测+sift描述匹配

最近用到&#xff1a;Harris检测图像中边缘处的特征点&#xff0c;并且需要两张图特征点匹配起来。Harris只是一个角点检测的算法&#xff0c;最终只得到特征点坐标&#xff0c;想要匹配需要描述&#xff0c;而Harris是单尺度的&#xff0c;自己写描述函数又有些麻烦。找到MATL…

python辅助脚本教程_微信跳一跳python辅助脚本实例分享

本文主要为大家整理了关于微信跳一跳的辅助脚本内容&#xff0c;这次我们给大家整理的是关于python的脚本内容&#xff0c;一起来学习下。这段时间微信跳一跳这个游戏非常火爆&#xff0c;但是上分又非常的难&#xff0c;对于程序员来说第一个念头就是通过写一个辅助脚本外挂让…

Bug解决方案

一&#xff1a;百度错误代码或者关键字搜索 二&#xff1a;在博客论坛招贴问人 三&#xff1a;向同事或者公司老人请教 四&#xff1a;程序的每个字母逻辑浏览一遍 五&#xff1a;重启电脑 六&#xff1a;环境软件重装 七&#xff1a;回去睡一觉&#xff0c;等待明天早上再看 八…

非Java专家的APM:什么泄漏?

通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用&#xff01; 内存&#xff0c;内存&#xff0c;内存... 内存是Java的关键部分&#xff0c;尤其是内存管理。 作为开发人员&#xff0c;内存管理不是您要定期执行…

总结libevent安装方法

1.先用&#xff1a;ls -al /usr/lib | grep libevent 查看是否已安装&#xff0c;如果已安装且版本低于1.3&#xff0c;则先通过&#xff1a;rpm -e libevent —nodeps 进行卸载。 2.下载libevent安装包&#xff1a;libevent-1.4.13-stable.tar.gz&#xff0c;然后解压。 3.切…

opencv中匹配点对的坐标提取

在opencv中&#xff0c;特征检测、描述、匹配都有集成的函数。vector<DMatch> bestMatches;用来存储得到的匹配点对。那么如何提取出其中的坐标呢&#xff1f; int index1, index2;for (int i 0; i < bestMatches.size(); i)//将匹配的特征点坐标赋给point{index1 b…

echarts 弹出放大_Echarts图标增加全屏/放大功能

需求描述&#xff1a;客户爸爸在看某个echarts图表时&#xff0c;图标的数据很多&#xff0c;字看着很小&#xff0c;客户爸爸希望能双击放大某个图表。如下面这个图表字太小&#xff0c;太密。image.png解决方式&#xff1a;网上有不少方式是用Echarts的tool工具先上自定义工具…