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

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

在某些情况下,对象的创建很复杂,可能需要某种程度的抽象,以便客户端代码无法意识到这些复杂性和内部实现细节。 在某些情况下,对象的创建在代码的各个部分中是分散的和重复的。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)Factory模式还有助于提高应用程序的可伸缩性,因为客户端代码仅引用接口,我们可以添加更多实现该接口的产品而无需在客户端代码中进行很多更改。 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/371968.shtml

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

相关文章

103. Binary Tree Zigzag Level Order Traversal

二刷。 BFS,基本习惯上用Iterative的做法来做,就是QUEUE。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ public class Solution…

java多线程系列13 设计模式 Future 模式

Future 模式 类似于ajax请求 页面异步的进行后台请求 用户无需等待请求的结果 就可以继续浏览或者操作 核心就是:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 JDK内置实现Future模式演示一下 public class RealData im…

lodop转到其他html页面,Lodop实现打印功能

思路:1、在 html 页面引入 LodopFuncs.js 文件,并用 object 标签和 embed 标签获取 lodop 对象2、在 js 中获取 html 页面中的 object 和 embed 对象,并使用getLodop() 方法得到 lodop 对象3、实现打印功能,以下三步是必需的初始化…

完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第3部分

Primefaces AutoComplete,JSF转换器 这篇文章从第一部分和第二部分继续。 JSF拥有Converter工具,可以帮助我们从用户视图中获取一些数据并将其转换为从数据库或缓存中加载的对象。 在“ com.converter”包中,创建以下类: packa…

html5首屏加载乐山暴雨,发布前端项目时因chunk-vendors过大导致首屏加载太慢,Vue Build时chunk-vendors的优化方案...

这个优化是两方面的,前端将文件打包成.gz文件,然后通过nginx的配置,让浏览器直接解析.gz文件。1、compression-webpack-plugin插件打包.gz文件安装插件npm install --save-dev compression-webpack-plugin或者yarn add compression-webpack-p…

width:100vh与min-height:calc(100vh + 51px)

vh:相对于视窗的高度,那么vw:则是相对于视窗的高度。 “视区”所指为浏览器内部的可视区域大小,即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小。 详细vh的用法,大家可以参考http…

XML配置文件中的Spring配置文件

我的上一个博客非常简单,因为它涵盖了我从Spring 3.0.x到Spring 3.1.x的轻松升级,最后我提到可以将Spring模式升级到3.1,以利用Spring的最新功能。 在今天的博客中,我将介绍这些功能中最酷的功能之一:Spring配置文件。…

交大计算机专业怎样,计算机专业高校实力排名,上海交大第五,清华第二,第一毫无争议...

原标题:计算机专业高校实力排名,上海交大第五,清华第二,第一毫无争议计算机专业在近几年可谓是“大热”,众多考生抢破头也想当码农,背后的原因其实不难理解。互联网时代的到来,计算机早已渗透到…

python_day7 绑定方法与非绑定方法

在类中定义函数如果 不加装饰器 则默认 为对象作为绑定方法 如果增加 classmethod 是 以 类 作为绑定方法 增加 classmethod 是 非绑定方法,就是不将函数 绑定 ##################### class Foo: def func(self): print(self) classmethod def func…

Spring Security使用Hibernate实现自定义UserDetails

大多数时候,我们将需要在Web应用程序中配置自己的安全访问角色。 这在Spring Security中很容易实现。 在本文中,我们将看到最简单的方法。 首先,我们将在数据库中需要以下表格: CREATE TABLE IF NOT EXISTS mydb.security_role (…

python之路-面向对象

编程范式 编程是 程序 员 用特定的语法数据结构算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这…

西安邮电大学计算机科学与技术有专硕吗,2020年西安邮电大学计算机学院考研拟录取名单及排名!...

20考研复试调剂群:4197552812020年西安邮电大学计算机学院硕士研究生招生复试成绩及综合排名各位考生:现将我院2020年硕士研究生招生复试成绩及综合排名公布(最终录取名单及新生学籍注册均以“全国硕士研究生招生信息公开平台”备案信息为准)&#xff0c…

用Java排序的五种有用方法

Java排序快速概述: 正常的列表: private static List VEGETABLES Arrays.asList("apple", "cocumbers", "blackberry");Collections.sort(VEGETABLES);output: apple, blackberry, cocumbers反向排序: pri…

[python]-数据科学库Numpy学习

一、Numpy简介: Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运…

检测一个点, 是否在一个半圆之内的方法

demo: http://jsbin.com/lihiwigaso 需求: 一个圆分成分部分, 鼠标滑上不同的区域显示不同的颜色 思路: 先判断这个点是否在圆之内, 再判断是否在所在的三角形之内就可以了 所需要的全部源码: <!DOCTYPE html> <html> <head><meta charset"utf-8&quo…

计算机网络设备接地规范,网络机房防雷接地的四种方式及静电要求

编辑----河南新时代防雷由于计算机网络系统的核心设备都放置在网络机房内&#xff0c;因而网络机房防雷接地有了较高的环境要求&#xff0c;良好的接地系统是保证机房计算机及网络设备安全运行&#xff0c;以及工作人员人身安全的重要措施。直流地的接法通常采用网格地&#xf…

抓住尾部的StackOverFlowError

使用Java程序时可能要处理的一种更烦人的情况是StackOverFlowError&#xff0c;如果您有一个很好的可生产的测试用例&#xff0c;那么关于使用堆栈大小或设置条件断点/某种痕迹 。 但是&#xff0c;如果您有一个测试案例可能一次失败100次&#xff0c;或者像我的案例一样在AWTM…

Gunicorn配置部分的翻译

写在前面&#xff0c;虽然翻译得很烂&#xff0c;但也是我的劳动成果&#xff0c;转载请注明出处&#xff0c;谢谢。 Gunicorn版本号19.7.1 Gunicorn配置 概述 三种配置方式 优先级如下&#xff0c;越后的优先级越大 1.框架的设置&#xff08;现在只有paster在用这个&#xff0…

台式计算机风扇声音大怎么处理,如何解决电脑电源风扇声音大的问题?

现在的台式机一般用3到5年后&#xff0c;一些问题自然也就慢慢表现出来了。很多网友在使用电脑过程中都有电脑风扇声音大怎么办的问题&#xff0c;电脑风扇声音大就会让人觉得使用电脑很不舒服&#xff0c;怎么办好呢&#xff1f;出现重要的问题要如何解决好呢&#xff1f;现在…

jsp分页功能

http://blog.csdn.net/xiazdong/article/details/6857515转载于:https://www.cnblogs.com/Baronboy/p/6112403.html