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

设计模式 工厂方法

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

技术性

正如我已经告诉您的那样,在工厂设计的情况下,我们将在运行时获得一个类似类型的对象,这样,对象的基础实现将位于屏幕后面。 让我们考虑一个简单的方法。 让我们考虑一个可以是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 。

参考: 工厂设计模式 -Debadatta Mishra博客上JCG合作伙伴 Debadatta Mishra 的有效方法 。

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

设计模式 工厂方法

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

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

相关文章

SMPP Java示例(客户端)

这篇文章通过创建一个简单的SMPP客户端向移动用户发送短信来提供SMPP Java示例&#xff0c;使用该客户端我们可以简单地提交以向单个移动用户发送消息&#xff0c;也可以一次将消息广播给多个移动用户。另外&#xff0c;我们将验证交货收据。 出于客户端的目的&#xff0c;我们…

mysql插入另一个表中数据_MySql中把一个表的数据插入到另一个表中的实现

1.如果2张表的字段一致&#xff0c;并且希望插入全部数据&#xff0c;可以用这种方法&#xff1a;INSERT INTO 目标表 SELECT * FROM 来源表;insert into insertTest select * from insertTest2;2.如果只希望导入指定字段&#xff0c;可以用这种方法&#xff1a;INSERT INTO 目…

mysql事务中怎么更改空值_MySQL事务

1.事务1.事务特性--ACIDAtomicity(原子性):要么全做,要么不做,不能只做一半(银行转账)Consistency(约束性):事务的前后,约束都能满足Isolation(依赖性):事务之间是独立的,互不影响的Durability(持久性):事务执行之后,事物的结果可以持久保存2.事务隔离级别:read uncommitted:可…

mysql自定义函数多参数_自定义mysql函数 - 无法传递参数

作为标题状态。这里的功能DELIMITER //CREATE FUNCTION GetCreateValue( table_name CHAR(64), id_field CHAR(64), name_field CHAR(64), name_value CHAR(64) )RETURNS INTEGERBEGINDECLARE ret INTEGER;SELECT count(*) INTO ret FROM table_name WHERE name_field name_va…

与Zapier集成

整合很无聊。 也是不可避免的。 但是我不会写有关企业集成模式的文章 。 相反&#xff0c;我将解释如何创建与Zapier集成的应用程序。 什么是Zapier &#xff1f; 它是一项服务&#xff0c;使您可以通过其API&#xff08;或协议&#xff09;连接两个&#xff08;或多个&#x…

python用psf函数_python学习之-类的内置函数

内置方法&#xff1a;__str__(该方法必须返回字符串类型),在对像被打印时自动触发,然后将该方法的返回值当做打印结果输出)class People:def __init__(self,name,age):self.namenameself.ageagedef __str__(self): #绑定给对象的方法return ‘‘ %(self.name,self.age) #这个方…

多用户远程连接mysql_Mysql权限控制 - 允许用户远程连接

Mysql为了安全性&#xff0c;在默认情况下用户只允许在本地登录&#xff0c;可是在有此情况下&#xff0c;还是需要使用用户进行远程连接&#xff0c;因此为了使其可以远程需要进行如下操作&#xff1a;一、允许root用户在任何地方进行远程登录&#xff0c;并具有所有库任何操作…

cxf 服务端soap报文_使用Apache CXF开发SOAP Web服务

cxf 服务端soap报文在上一篇文章中&#xff0c;我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤。 在本文中&#xff0c;我将讨论使用CXF开发SOAP Web服务。 在继续前进之前&#xff0c;让我们先了解一下构成SOAP Web服务的概念/元素 SOAP或简单对象访问协议 SOAP是一…

Java 8日期和时间

如今&#xff0c;一些应用程序仍在使用java.util.Date和java.util.Calendar API&#xff0c;包括使我们的生活更轻松地使用这些类型的库&#xff0c;例如JodaTime。 但是&#xff0c;Java 8引入了新的API来处理日期和时间&#xff0c;这使我们可以对日期和时间表示进行更精细的…

php mysql 随机字符串_MySQL_Mysql 自定义随机字符串的实现方法,前几天在开发一个系统,需要 - phpStudy...

Mysql 自定义随机字符串的实现方法前几天在开发一个系统&#xff0c;需要用到随机字符串&#xff0c;但是mysql的库函数有没有直接提供&#xff0c;就简单的利用现有的函数东拼西凑出随机字符串来.下面简单的说下实现当时.1.简单粗暴.select ..., substring(MD5(RAND()),floor(…

python哪些类型可以作为迭代器_python0.8-----set类型与迭代器

set:类似dict&#xff0c;是一组dict的集合&#xff0c;不存储value。本质&#xff1a;无序(没有下标)无重复的元素的集合。创建&#xff1a;创建set需要一个list或者tuple或者dict作为输入集合。重复元素在色中会被自动过滤。s1[1,2,3,4,5,6,1,2]set(s1){1,2,3,4,5,6} --表示》…

线程池实现填充短信_填充一个池需要多少个线程?

线程池实现填充短信在最近几个月中&#xff0c;我们一直看到很小但持续的操作失败&#xff0c;但有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接&#xff1b; 嵌套异常是java.sql.SQLException&#xff1a;客户端尝试检出…

python线性回归x可以数量不一样吗_R和Python中的线性回归 - 在同一问题上的结果不同...

只是指出这一点&#xff1a; statsmodel s least squares fit does by default not include a constant. If we remove the constant from R适合&#xff0c;我们得到与Python实现非常相似的结果&#xff0c;或者相反&#xff0c;如果我们向 statsmodel -fit添加一个常量&#…

PostgreSQL开放自由

Open Liberty是源自WebSphere Liberty的有趣的新型OSS Java EE应用服务器。 您可以将Open Liberty配置为使用PostgreSQL作为其默认数据源&#xff0c;如下所示&#xff1a; 将<datasource> &#xff0c; <jdbcDriver>和<library>指令添加到server.xml配置中…

实现mysql百度式查询_mysql查询优化建议(百度)

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中使用!或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描。3.应尽量避免在 where 子句中对字段进行 null 值判断…

海思芯片怎么使用tde给qt加速_3519移植Qt适配附件

【实例简介】修改Qt5.5.1linuxfb插件代码&#xff0c;适配海思3519平台【实例截图】【核心代码】3519Qt移植.tar├── 3519Qt绉绘│ ├── linuxfb│ │ ├── include│ │ │ ├── acodec.h│ │ │ ├── fisheye_calibrate.h│ │ │ ├─…

jsf标签_多个动态包含一个JSF标签

jsf标签每个JSF开发人员都知道ui&#xff1a;include和ui&#xff1a;param标签。 您可以包括一个facelet&#xff08;XHTML文件&#xff09;并传递一个对象&#xff0c;该对象将在包含的facelet中可用&#xff0c;如下所示&#xff1a; <ui:include src"/sections/co…

用Java比较文件

我正在为PACKT创建一系列有关Java网络编程的视频教程。 有整节关于Java NIO。 一个示例程序是通过原始套接字连接将文件从客户端复制到服务器。 客户端从磁盘读取文件&#xff0c;服务器将到达的字节保存到磁盘。 因为这是一个演示&#xff0c;所以服务器和客户端在同一台计算机…

java哈希_Java如何采用哈希码实现分类(以员工分配为例)

5.总程序&#xff1a;下面代码是我们获取的所有的程序代码&#xff0c;如下&#xff1a;public static void main(String[] args) {Scanner scannew Scanner(System.in);System.out.println("请输入员工姓名&#xff1a;");String namescan.nextLine();System.out.pr…

java反射的原理_java反射机制的实现原理

java反射机制的实现原理反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。下面具体介绍一下java的反射机制。这里你将颠覆原来对java的理解。Java的反射机制的实现要借助于4个类&#xff1a;class&…