工厂设计模式–一种有效的方法

如您所知,工厂方法模式或俗称工厂设计模式是“创意设计模式”类别下的一种设计模式。 模式背后的基本原理是,在运行时,我们根据传递的参数获得类似类型的对象。 关于这种模式有很多文章,开发人员可以通过各种方式来实现它。 在本文中,我将向您展示如何创建一种更好,最有效的工厂设计模式设计方法。

技术性

正如我已经告诉您的那样,在工厂设计的情况下,我们将在运行时获得一个类似类型的对象,这样,对象的基础实现将位于屏幕后面。 让我们考虑一个简单的方法。 让我们考虑一个可以是Male或Female的Person对象。 在运行时,我们仅应考虑人的行为,而不应考虑性别。 作为传统方法,我们创建一个Person接口,并创建两个实现类,例如MalePerson和FemalePerson。 根据运行时性别数据,我们传递到Factory类的Factory方法,在其中确定性别类型是Male还是Female,因此我们创建特定类的实例并返回引用类型对象。 这种方法听起来不错,我们在许多开发活动中都采用了这种方法。 在细粒度的多线程应用程序中,我们可以确保它是有效的方法吗? 表现如何呢? 还有其他方法吗? 是的,我们愿意。

让我们考虑另一个实时示例。 考虑一个组织中的一种情况,该雇员可以担任CEO,CTO,CFO,开发人员,测试工程师,人力资源,人事,安全等。如果您想根据组织来了解员工的角色,您会怎么做? 您将如何创建更好的工厂设计,以便我们可以轻松地找到角色并且不应有性能损失? 您是否会通过提供多个if子句来采用相同的传统方法? 您可以提出一个论点,我们应该使用切换条件。 很好……让我们看看传统方法,然后让我们测量时间。

让我们以传统方式采用工厂设计。

package com.ddlab.rnd.patterns;
/*** @author Debadatta Mishra(PIKU)**/
public interface Roles 
{public String getRole();
}

上面的接口用作一种类型,因为组织中可以有各种类型的角色。 它具有一个称为“ getRole()”的方法,用于指定员工角色的描述。

让我们为组织中CEO,CTO和CFO的合适角色设计实现类。

package com.ddlab.rnd.patterns;
/*** @author Debadatta Mishra(PIKU)**/
public class CEORoles implements Roles 
{public String getRole() {return "CEO is the supreme head of the company";}
}package com.ddlab.rnd.patterns;
/*** @author Debadatta Mishra(PIKU)**/
public class CFORoles implements Roles
{@Overridepublic String getRole() {return "CFO is the finance head of a company";}
}package com.ddlab.rnd.patterns;
/*** @author Debadatta Mishra(PIKU)**/
public class CTORoles implements Roles
{@Overridepublic String getRole() {return "CTO is the technology decision maker of a company";}
}

现在,我们必须考虑从中动态创建对象的工厂。 让我们看下面的代码。

package com.ddlab.rnd.patterns;
/*** @author Debadatta Mishra(PIKU)**/
public abstract class EmployeeFactory
{public static Roles getRole( String type ){Roles roles = null;if( type.equals("cfo"))roles = new CFORoles();else if( type.equals("cto"))roles = new CTORoles();else if( type.equals("ceo"))roles = new CEORoles();return roles;}
}

让我们编写一个简单的测试工具类来验证设计。

package com.ddlab.rnd.patterns;
/*** @author Debadatta Mishra(PIKU)**/
public class TestTraditionalFactoryDesign 
{public static void main(String[] args) {String type = "ceo";long startTime = System.nanoTime();String role = EmployeeFactory.getRole(type).getRole();System.out.println("Role ::: "+role);long endTime = System.nanoTime();System.out.println("Time difference ::: "+(endTime-startTime)+" nano seconds");}}

如果运行上述程序,则以下是我系统的输出。

仅供参考,我的系统具有4 GB RAM和I5处理器。

Role ::: CEO is the supreme head of the company
Time difference ::: 3477574 nano seconds

上面的设计似乎是正确的,但是性能呢? 您可能会说没关系,因为它以纳秒为单位。 当然,您的应用程序是否很小并不重要,但是对于大型企业应用程序而言,这确实很重要。 如果您是优秀的程序员或开发人员,则不能忽略性能问题,尤其是在产品开发的情况下,它们可能是市场上的同类产品。

为了解决上述问题,让我们尝试另一种工厂设计方法,即工厂类可能有所更改。

让我们看下面的代码。

package com.ddlab.rnd.patterns;
/*** @author Debadatta Mishra(PIKU)**/
public enum EmployeeType 
{CEO("CEO") {@Overridepublic Roles getRoles() {return new CEORoles();}},CTO("CTO"){@Overridepublic Roles getRoles() {return new CTORoles();}},CFO("CFO"){@Overridepublic Roles getRoles() {return new CFORoles();}};private EmployeeType( String type ){this.type = type;}private String type;public abstract Roles getRoles();public String getType() {return type;}@Overridepublic String toString() {return "TYPE CODE -> "+type;}
}

下面给出了测试线束等级。

package com.ddlab.rnd.patterns;
import java.util.HashMap;
import java.util.Map;
/*** @author Debadatta Mishra(PIKU)**/
public class TestFactoryDesign 
{static Map<String,EmployeeType> typeMap = new HashMap<String,EmployeeType>();static{typeMap.put("cto", EmployeeType.CTO);typeMap.put("ceo", EmployeeType.CEO);typeMap.put("cfo", EmployeeType.CFO);}public static void main(String[] args){String empType = "ceo";try {long startTime = System.nanoTime();String whatIstheRole = typeMap.get(empType).getRoles().getRole();System.out.println("Role of the Employee :::"+whatIstheRole);long endTime = System.nanoTime();System.out.println("Time difference ::: "+(endTime-startTime)+" nano seconds");}catch (NullPointerException e) {System.out.println("No such Role is found");e.printStackTrace();}}
}

如果运行上面的代码,您将获得以下输出。

Role ::: CEO is the supreme head of the company
Time difference ::: 1049108 nano seconds

那时间呢 让我们在传统方法和现代方法之间花费时间进行比较。

传统方法 3477574纳秒
现代方法(使用枚举和映射) 1049108纳秒

您能考虑一下时差吗,它仅比传统方法快3倍。

那么哪个更好呢? 当然,使用枚举的现代方法更好。 除了枚举,我还使用Map来维护雇员类型及其对应的枚举的列表。 在这种情况下,就循环复杂性而言,无需使用if子句可能会影响我们的性能。 最好使用上述1049108纳秒的方法。 您可以将ConcurrentMap用于多线程应用程序。

结论

希望您喜欢我关于工厂设计模式的文章。 如果有任何澄清,您可以与我联系debadatta.mishra@gmail.com 。

参考: 工厂设计模式–我们的JCG合作伙伴 Debadatta Mishra在Debadatta Mishra博客上的一种有效方法 。

翻译自: https://www.javacodegeeks.com/2013/06/factory-design-pattern-an-effective-approach.html

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

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

相关文章

java 循环依赖_解决Java循环依赖的问题

最近看到一个问题&#xff1a;如果有两个类A和B&#xff0c;A类中有一个B的对象b&#xff0c;B类中有一个A的对象a&#xff0c;那么如何解决这两个类的相互依赖关系呢&#xff0c;几天就给大家说一下Java的循环依赖&#xff0c;raksmart服务器。举个栗子1&#xff1a;可以看到A…

CSS块元素水平垂直居中的实现技巧

针对之前遇到过的一些特殊样式的实现&#xff0c;我今天做个总结&#xff0c;目的有二&#xff1a;一是将这些方法记录下来&#xff0c;以便将来需要用到时查找使用。二为将这些大神们智慧的结晶发扬光大&#xff0c;让广大前端程序猿们能够少走弯路。此贴为更新帖&#xff0c;…

Intellij IDEA 将工程转换成maven工程 详解

1> 右键工程&#xff0c;点击 Add Framework Support2> 选中 Maven&#xff0c;再点击 OK3> 工程根目录自动生成 pom.xml 文件&#xff0c;这样 工程就支持 Maven版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 http://blog.csdn.net/che…

设置Apache Hadoop多节点集群

我们正在分享有关在基于Linux的机器&#xff08;多节点&#xff09;上安装Apache Hadoop的经验。 在这里&#xff0c;我们还将分享我们在各种故障排除方面的经验&#xff0c;并在将来进行更新。 用户创建和其他配置步骤– 我们首先在每个集群中添加一个专用的Hadoop系统用户。…

数据结构(七)排序---直接插入排序(稳定)

经典排序算法----直接插入排序算法及其改进&#xff08;稳定&#xff09; 定义&#xff1a; 直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的&#xff0c;记录数加一的有序表。 实现思想 我们预留了一个哨兵&#xff0c;这里我们将…

CSS3中的透明属性opacity的用法实例

实例设置 div 元素的不透明级别&#xff1a;div{opacity:0.5;}完整例子&#xff1a;<!DOCTYPE html><html><head><style> div{background-color:red;opacity:0.5;filter:Alpha(opacity50); /* IE8 以及更早的浏览器 */}</style></head><…

java嵌套类型 无法隐藏外层类型_java内部类深入详解 内部类的分类 特点 定义方式 使用...

java内部类 内部类的分类 特点 定义方式 使用 外部类调用内部类 多层嵌套内部类 内部类访问外部类属性 接口中的内部类 内部类的继承 内部类的覆盖 局部内部类 成员内部类 静态内部类 匿名内部类内部类定义将一个类定义放到另一个类的内部,这就是内部类内部类与组合是完…

java.io.FileNotFoundException: generatorConfig.xml (系统找不到指定的文件。)

在使用MyBatis的逆向工程生成代码时&#xff0c;一直报错java.io.FileNotFoundException: generatorConfig.xml (系统找不到指定的文件。)&#xff0c;如图 文件结构如下&#xff1a; 代码如下&#xff1a; import java.io.File; import java.util.ArrayList; import java.util…

单例设计模式–鸟瞰

几天前&#xff0c;当我回到家乡时&#xff0c;我的一位来自同事的大三学生参加了一家跨国公司的采访&#xff0c;在采访过程中受了重伤。 我的意思是&#xff0c;由于面试小组提出的难题&#xff0c;他无法使面试合格。 当我回到班加罗尔时&#xff0c;他分享了他在技术面试中…

软件实践第一步——自我介绍

031602631&#xff1b;我是超爱美食的苏韫月&#xff1b;我的爱好是品尝所能接触到的所有甜点&#xff08;迟早&#xff01;&#xff09;&#xff1b;我最近新宠&#xff1a;拌面加扁肉&#xff08;京园淳百味&#xff09;&#xff1b;时隔一年我又回归心惊胆颤写博客文的日子。…

CSS3中使用translate() 方法实现元素位置的移动

translate() 方法通过 translate() 方法&#xff0c;元素从其当前位置移动&#xff0c;根据给定的 left&#xff08;x 坐标&#xff09; 和 top&#xff08;y 坐标&#xff09; 位置参数&#xff1a;实例div{transform: translate(50px,100px);-ms-transform: translate(50px,1…

java机器学习库_Amazon Deep Java Library——Java 机器学习工具箱

近年来&#xff0c;人们对机器学习的兴趣稳步增长。具体来说&#xff0c;现在&#xff0c;企业在各种各样的场景中使用机器学习进行图像识别。它在汽车工业、医疗保健、安全、零售、仓库、农场和农业的自动化产品跟踪、食品识别&#xff0c;甚至通过手机摄像头进行实时翻译等方…

阻抗计算

si9000也可以算 一般有点差异&#xff0c;板厂可以微调 加上滤油&#xff0c;实际阻抗会降低2-3欧 影响最大的是层厚 先选择最薄的芯板&#xff0c;注意差分线的阻抗匹配&#xff0c;间距越小&#xff0c;阻抗小&#xff0c; 转载于:https://www.cnblogs.com/IotI/p/8587277.h…

Spring Data Solr教程:动态查询

Solr通常被称为搜索服务器&#xff0c;我们可以在实现全文搜索功能时使用它。 但是&#xff0c;当我们实现从搜索表单获取其输入的搜索功能时&#xff0c;利用Solr的性能通常是明智的。 在这种情况下&#xff0c;执行的搜索查询取决于收到的输入。 这意味着查询参数的数量取决…

[cdq分治][树状数组] Jzoj P4419 hole

Description GFS打算去郊外建所别墅&#xff0c;享受生活&#xff0c;于是他耗费巨资买下了一块风水宝地&#xff0c;但令他震惊的是&#xff0c;一群DSJ对GFS的富贵生活深恶痛绝&#xff0c;决定打洞以搞破坏。现在我们简化一下这个问题&#xff0c;在这片土地上会按顺序发生一…

关于CSS3实现响应式布局的一些概念和术语

响应式布局也被应用到网站前端开发中&#xff0c;在国内这一词想必是非常火吧&#xff0c;那网站为什么要使用响应式布局呢&#xff1f;原因和其他创意性的生活用品基本上是一样的&#xff0c;处于对人力物力财力的节省和对生活富有诗意的一种追求。在人力物力和财力有限的情况…

AjaxSubmit+Servlet表单文件上传和下载

一、背景 前段时间公司要求我做一个上传和下载固件的页面&#xff0c;以备硬件产品在线升级&#xff0c;现在我把这部分功能抽取出来作为一个Demo Project给大家分享。 话不多说&#xff0c;先看项目演示 --> 演示 源码 二、源码 前端 js库&#xff1a;jquery-3.2.1.min.js…

番石榴的EventBus –简单的发布者/订阅者

在查看Google的Guava Libraries 版本10的最新版本时&#xff0c;我注意到EventBus的添加。 这是发布-订阅样式消息传递系统的轻量级实现。 这类似于JMS提供的发布-订阅模型&#xff0c;但是消息保留在应用程序内&#xff0c;而不是在外部广播。 EventBus允许您在程序中创建对象…

apscheduler -定时任务

https://apscheduler.readthedocs.io/en/latest/userguide.html 简单的使用方式为&#xff1a; from apscheduler.schedulers.blocking import BlockingScheduler sched BlockingScheduler()sched.add_job(ff_task,cron,hour0-1,8-23,minute28)sched.add_job(avor_task, cron,…

java迭代器 异常_java迭代器失效 | 学步园

今天在测试代码的时候出现一个异常ConcurrentModificationException&#xff0c;该异常网上很多解决方案以及解释&#xff0c;但我还是再记录一遍吧。代码抽象出来是这样的&#xff1a;import java.util.ArrayList;import java.util.List;public class Test {public static voi…