工厂设计模式解决什么问题_使用工厂模式解决设计问题

工厂设计模式解决什么问题

工厂设计模式是面向对象环境中最常用的模式之一。 再次来自“创意设计”模式类别,即有关对象创建的所有信息。

在某些情况下,对象的创建很复杂,可能需要某种程度的抽象,以便客户端代码不了解这些复杂性和内部实现细节。 在某些情况下,对象的创建在代码的各个部分中是分散的和重复的。Factory模式通过定义一个专门创建对象的接口解决了这些问题,但该接口使实现类具有灵活性来决定要实例化哪个类。

定义:
Factory方法模式是定义用于创建对象的接口,但将对象创建委托给子类。

目的:
查看问题陈述,目标应该是:

  • 客户端应该不知道对象实例化
  • 客户端应通过公共接口访问对象。
你知道吗?
工厂方法设计模式通常与装饰器设计模式一起用于各种框架(例如Struts,Spring,Apache)中。 有许多基于此Factory模式的J2EE模式,例如DAO模式。

工厂模式使用哪种面向对象设计原理?

封装:因为它封装了来自客户端的创建代码。 显然,您可以认为封装的好处也适用于这种模式,例如松耦合和内聚。

实际示例:

考虑一个服装工厂,该工厂生产各种类型的服装,例如衬衫,裤子。 消费者可以通过工厂索要所需的服装类型。 但是,从消费者的角度来看,他们完全不知道是谁在创建此对象。 他们只是知道工厂正在为他们提供所需的服装。

问题陈述:

一种标准做法是通过调用“ new”关键字来创建对象。 设想一个场景,在客户端类中有多种情况,我们调用了多个新关键字来创建新对象。

if (selection.equalsIgnoreCase("Trouser")) {return new Trouser();} else if (selection.equalsIgnoreCase("Shirt")) {return new Shirt();}

如果现在必须添加夹克或毛衣,则必须继续修改客户端代码,并进一步添加new关键字。 这将导致对客户端代码的依赖性,从而使其难以维护。

另一个问题是,客户端应用程序必须知道多少类型的具体类可以预先使用。 以后,如果我们必须添加另一个具体的类,例如毛衣或夹克,则必须更改并重新编译客户代码。

解:
为了解决上述问题,可以显式使用工厂模式。

  • 使用Factory类可以解决访问太多新关键字的第一个问题。
  • 第二个问题可以通过使用具体类将实现的接口来解决,客户端将始终指向该接口类而不是具体类。 因此,以这种方式,客户将完全不知道所需的各种类型的具体类。
什么是接口?
Java中的接口是没有实现的方法定义的集合。 实现接口的类必须提供实现,并且必须实现接口中描述的所有方法。 该接口是一个契约,它告诉类要做什么,让类决定如何实现它们。
interface Bounceable {void setBounce();
}

下面的类图将全面概述Factory Pattern的实现:

工厂模式类图

让我们看一下实现工厂模式的示例代码:

GarmentType.java
public interface GarmentType {String print();
}
Trouser.java
public class Trouser implements GarmentType {@Overridepublic String print() {System.out.println("Trouser Created");return "Trouser";}}
Shirt.java
public class Shirt implements GarmentType {@Overridepublic String print() {System.out.println("Shirt Created");return "Shirt";}
}
GarmentFactory.java
public class GarmentFactory {public static 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");}
}
客户端程序
public class Client {public static void main(String[] args) {System.out.println("Enter your selection:");BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String selection = null;try {selection = br.readLine();} catch (IOException e) {e.printStackTrace();}GarmentType objGarmentType = GarmentFactory.createGarments(selection);System.out.println(objGarmentType.print());}
}

工厂模式的优势:

a)此客户端不需要了解需要创建的对象的子类。 它需要引用接口和工厂对象。
b)对象创建过程从客户端带到工厂,从而使客户端代码与对象创建代码脱钩。 反过来,这将有助于重用,因为此代码可被其他客户端使用。
c)工厂模式还有助于提高应用程序的可伸缩性,因为客户端代码仅引用接口,我们可以添加更多实现该接口的产品,而无需在客户端代码中进行很多更改。 d)如果应用程序使用Factory模式(因为对象创建是集中的),则代码可维护性将是有益的。

参考: 通过 Idiotechie博客上的JCG合作伙伴 Mainak Goswami 使用Factory Pattern解决设计问题 。


翻译自: https://www.javacodegeeks.com/2012/07/solve-design-problems-using-factory.html

工厂设计模式解决什么问题

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

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

相关文章

shiro 认证思路

转载于:https://www.cnblogs.com/hwgok/p/9101232.html

Java 9对可选的补充

哇&#xff0c;人们对Java 9的Stream API增添了 真正的兴趣。 想要更多&#xff1f; 让我们看一下…… 可选的 可选::流 这不需要任何解释&#xff1a; Stream<T> stream();想到的第一个词是&#xff1a; 终于 &#xff01; 最后&#xff0c;我们可以轻松地从可选值流…

Matlab功率谱估计

(2012-03-16 12:22:15) 随机信号处理 * 随机变量分布特征量 均值mean 协方差矩阵cov 相关系数矩阵corrcoef [R, P] corrcoef(X)&#xff0c;P值用于检验相关性&#xff0c;越小越相关&#xff0c;0.05以下为显著相关。 * 相关函数估计 相关函数估计xcorr [c,lags] xcorr(…

OO第三次博客作业——规格

OO第三次博客作业——规格 一、调研结果&#xff1a; 规格的历史&#xff1a; 引自博文链接&#xff1a;http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世界&#xff0c;而软件的特点是构造世界。软件的最底层就是0&#xff0c;1&#xff0c;两个…

EndNote使用技巧之一--参考文献的导入

2012-11-20 11:54:15| 分类&#xff1a; 学术相关 | 标签&#xff1a; |字号大中小 订阅 一、怎样给课题组的其他人员共享我的library? 打开要共享的libirary→点击file→send to→compressed lirary→在 Send to Compressed Library 窗口确认储存路径与文件名&#xf…

5.29

查看linux系统中空闲内存/物理内存使用/剩余内存 free -m top命令 是Linux下常用的性能 分析工具 ps -eL |wc -l 查看进程数 ulimit -a 查看资源限制 echo DDS_ROOT 查看DDS设置的环境变量 tcpdump -i eth0 src 192.168.2.204 查看源IP204的eth0网卡的数据包接收情况 用vi进入…

primefaces_PrimeFaces在GlassFish 3.1.2.2上推动大气

primefacesPrimeFaces 3.4在三天前发布。 除了通常令人敬畏的新组件和更新组件外&#xff0c;它还包括新的PrimeFaces Push框架。 基于Atmosphere&#xff0c;这为您的应用程序提供了简单的推送机制。 这是在最新的GlassFish 3.1.2.2上配置和运行它的方法。 准备工作 像往常一…

相关的意义

第四章 相关系数 [内容导读]   本章的内容在课程中具有承上启下的重要作用。一方面&#xff0c;相关系数是反映与描述一组数据的概括性特征量数&#xff0c;只不过这里的数据是二元变量的观测数据。另一方面&#xff0c;对相关系数内容的理解与掌握&#xff0c;是建立在散点…

oo第三次作业

一、规格历史 最初的程序设计是直接面向机器的&#xff0c;代码编写困难、可读性差&#xff0c;当时对于软件开发的需求并不多。随着对于程序规模的需求&#xff0c;出现了面向过程的设计思想&#xff0c;开发者开始忽略底层实现&#xff0c;进行程序设计。对于面向过程设计思想…

帮助推动Java EE向前发展

如果您还记得我写的题为《 Java EE 8&#xff1a;当前状态是什么》的文章 &#xff0c;很明显&#xff0c;在过去的几个月中&#xff0c;Java EE的发展肯定已经放缓。 肯定有一些Java EE下的JSR具有比其他JSR更多的活动&#xff0c;但是自JavaOne 2015以来&#xff0c;整个Java…

35

1 转载于:https://www.cnblogs.com/venicid/p/9116284.html

glassfish默认密码_在MySQL上使用含盐密码的GlassFish JDBC安全性

glassfish默认密码我在该博客上最成功的文章之一是有关在GlassFish上使用基于表单的身份验证设置JDBC安全领域的文章 。 对这篇文章的一些评论使我意识到&#xff0c;要真正使它安全&#xff0c;应该做的还很多。 开箱即用的安全性 图片&#xff1a; TheKenChan &#xff08; …

Endnote生成的中英文混排参考文献中“等”与“et al”的处理

已有 12791 次阅读 2010-3-27 00:50 |个人分类:学习|系统分类:科研笔记|关键词:Endnote,参考文献,等,et al from: http://blog.sciencenet.cn/home.php?modspace&uid485&doblog&id306545 相信有很多科研工作者在管理参考文献、写论文时选用了Endnote作为首选参考…

【洛谷】P4643 【模板】动态dp

题解 在冬令营上听到冬眠的东西&#xff0c;现在都是板子了猫锟真的是好毒瘤啊(雾) (立个flag&#xff0c;我去thusc之前要把WC2018T1乱搞过去 &#xff09; 好的&#xff0c;我们可以参考猫锟的动态动态dp的课件&#xff0c;然后你发现你什么都看不懂&#xff08;菜啊 但是我们…

让 CentOS 启动时不启动桌面服务

[日期&#xff1a;2012-11-03] 来源&#xff1a;Linux社区 作者&#xff1a;kandyer [字体&#xff1a;大 中 小] 修改/etc/inittab文件&#xff0c;将 id:5:initdefault: 改为 id:3:initdefault: Linux 系统任何时候都运行在一个指定的运行级上&#xff0c;并且不同的运…

bzoj2721樱花——质因数分解

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id2721 可以知道 x 和 y 一定都大于 n! &#xff0c;不妨把 y 表示为 n!t &#xff1b; 那么 1/x 1/y 1/x 1/(n!t) 1/n! &#xff1b; 整理一下&#xff0c;最终变成&#xff1a;x (n!)/t 1 &#xff1b…

带有WildFly Swarm的远程JMS

我再次在博客上谈论WildFly群&#xff1f; 简短的版本是&#xff1a;我需要对远程JMS访问进行测试&#xff0c;并且拒绝设置复杂的功能&#xff08;如完整的应用程序服务器&#xff09;。 这个想法是要有一个简单的WildFly Swarm应用程序&#xff0c;该应用程序配置了队列和主题…

CentOS,重启的常用命令

重启命令 Linux中常用的关机和重新启动命令有shutdown、halt、reboot以及init&#xff0c;它们都可以达到关机和重新启动的目的&#xff0c;但是每个命令的内部工作过程是不同的&#xff0c;下面将逐一进行介绍。 1. shutdown shutdown命令用于安全关闭Linux系统。有些用户会…

nosql怎么使用_使用NoSQL实施实体服务–第5部分:使用云提高自治性

nosql怎么使用在之前的文章中&#xff0c;我讨论了如何通过结合使用Java Web Services &#xff0c; Java EE和CouchDB NoSQL数据库为产品构建SOA“实体”服务。 在本系列的最后一篇文章中&#xff0c;我将利用我已经创建的一些技术资产&#xff0c;并使用一些流行的SOA模式实现…

串口MSComm控件五种不同校验方式对数据收发的影响

(2008-09-10 14:50:00) http://blog.sina.com.cn/s/blog_470eccc60100arq7.html串口MSComm控件有五种校验方式&#xff0c;分别是无校验&#xff08;None&#xff09;&#xff0c;奇校验&#xff08;Odd&#xff09;&#xff0c;偶校验&#xff08;Even&#xff09;&#xff0c…