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

技术性

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

工厂设计模式–一种有效的方法相关推荐

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

    设计模式 工厂方法 如您所知,"工厂方法模式"或俗称"工厂设计模式"是"创意设计模式"类别下的一种设计模式. 模式背后的基本原理是,在运行时 ...

  2. java抽象工厂设计模式_23种经典设计模式的java实现_1_抽象工厂模式

    抽象工厂模式的适用: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想 ...

  3. 【设计模式】工厂设计模式

    工厂设计模式 三种工厂模式 简单工厂模式(静态工厂模式) 基本介绍 设计方案 工厂方法模式 基本介绍 设计方案 抽象工厂模式 基本介绍 设计思路 JDK源码 Calendar类 通过具体的需求 看一个 ...

  4. Spring通过工厂创建对象的三种方法详解(工厂设计模式)

    1.场景描述 在创建对象的过程中,常常创建出的对象并不能直接使用,它可能需要若干步复杂的步骤,处理完成后才能正常使用.比如有一个网络连接的类NetConn,类中有加载配置文件的方法load(),测试网 ...

  5. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  6. 设计模式(一) 工厂模式 五种写法总结

    转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52798423 本文出自:[张旭童的博客] 系列开篇瞎BB 设计模式相关的文章学习与总结, ...

  7. java二十三种设计模式——工厂设计模式

    java设计模式的分类 在java中,设计模式有三十三种之多,分为三大类: 创建性模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构性模式,共七种:适配器模式.装饰器模式 ...

  8. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

  9. 剖析java三种工厂设计模式

    java三种工厂设计模式 1. 简单工厂模式 简单工厂有以下三个主角: Factory:工厂负责生产产品 AbstructProduct:抽象产品,就好比华为手机,我没说是华为那个型号手机. Prod ...

最新文章

  1. 业界 | 微软亚洲研究院携手培生,以人工智能技术赋能个性化学习
  2. CCS卸载安装过程及所遇问题
  3. springcloud ribbon @LoadBalance负载均衡源码流程分析
  4. TcpSocket编程与Event编写学习的好例子
  5. ie浏览器跳转谷歌浏览器_微软IE浏览器的命运:加速死亡
  6. 根据网页地址获取页面内容
  7. java有什么压力_编程语言的心智负担!你学编程得有多大的压力快来测试一下...
  8. C++学习笔记系列(一)
  9. Java中HashMap和TreeMap的区别
  10. 关于私钥加密、公钥加密、签名在生活中的场景
  11. python 函数参数的传递(参数带星号的说明) 元组传递 字典传递
  12. spring 整合websocket过程中遇到的问题
  13. PHP单元测试PHPUnit
  14. app接码教程,附源码
  15. Windows操作系统知识合集
  16. 文字超出部分用省略号表示
  17. 【Excel】Excel无序数据模糊查询
  18. 软件体系结构网课第一次笔记
  19. html onclick事件无效 巨坑
  20. 三角函数形式的傅里叶级数

热门文章

  1. 玩物得志Java笔试题_代码规范利器-CheckStyle
  2. java 泛型参数的类型_Java获得泛型参数类型
  3. ps查看所有php进程,ps命令就是最基本进程查看命令
  4. git rebase命令(转)
  5. 本地java【动态监听】zk集群节点变化
  6. Maven常见问题之【-Dmaven.multiModuleProjectDirctory system property is not set】
  7. maven配置junit5_JUnit 5和Selenium –改善项目配置
  8. jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式
  9. jsf 项目_您将在下一个项目中使用JSF吗?
  10. eap和psk_针对WildFly和EAP运行Java Mission Control和Flight Recorder