设计模式 工厂方法

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

技术性

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

设计模式 工厂方法

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

  1. 瓷砖铺贴方法_瓷砖的12种铺贴方法

    1)菱形铺法 在正铺的基础上45°旋转的效果,注意因为后期切割的关系,损耗会略大,建议多买几片备用. 2)工宇铺(砖形铺贴) 最近几年比较流行的正方形工字铺,相较正铺,给人感觉线条更多变有趣. 3)人 ...

  2. getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...

    文章系列目录(持续更新中): [设计模式]第一篇:概述.耦合.UML.七大原则,详细分析总结(基于Java) [设计模式]第二篇:单例模式的几种实现And反射对其的破坏 一 为什么要用工厂模式 之前讲 ...

  3. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

  4. java设计模式之美_《设计模式之美》-笔记

    单例模式 单例模式实现方式 1.饿汉式 2.懒汉式 3.双重检测 4.静态内部类 5.枚举 单例模式存在的问题 单例对 OOP 特性的支持不友好 单例会隐藏类之间的依赖关系 单例对代码的扩展性不友好 ...

  5. java按两列输出_有没有一种简单的方法可以将两列输出到Java中的控制台? - java...

    如标题所述,是否有一种简单的方法可以将两列输出到Java中的控制台? 我知道\t,但是在使用printf时,我还没有找到基于特定列进行空间分配的方法. 参考方案 使用宽度和精度说明符,将其设置为相同的 ...

  6. 常用的分隔符有哪三种_掌握这三种调漂方法,你想怎么钓就怎么钓,再也不用求人...

    调漂对于刚学钓鱼的钓友来说是一件非常头痛的事情,每次钓鱼大部分时间都浪费在调漂上,总是感觉调不好,不是灵了就是钝了!那么问题到底出在哪呢?今天就和大家分享三种针对悬坠钓的调漂方法,看懂弄明白了,再也不 ...

  7. isfile方法_递归算法是一种直接或者间接调用自身函数或者方法的算法

    http://blog.csdn.NET/wangjinyu501/article/details/8248492 原版 一.基本概念 递归算法是一种直接或者间接调用自身函数或者方法的算法.Java递 ...

  8. python方法_详细解读Python中的__init__()方法

    __init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是__init__()参数值可以有多种形式. 因为有很多 ...

  9. html是以一种通用的方法来,c++ 有一种通用的方法来使函数模板适应为多态函数对象吗?...

    我有一些功能模板,例如 template void foo(T); template void bar(T); // others 我需要将每一个传递给一种算法,它将被称为各种类型的算法. templ ...

  10. tp3 默认模块 默认方法_您需要了解的有关默认方法的所有信息

    tp3 默认模块 默认方法 因此,默认方法是--昨天的新闻,对不对? 是的,但是使用了一年之后,积累了很多事实,我想将这些事实收集在一个地方,供刚开始使用它们的开发人员使用. 甚至有经验的人都可以找到 ...

最新文章

  1. 测量场效应晶体管(JFET) 2N3819
  2. 微软官方python教程下载-微软官方上线 Python 教程
  3. android include 点击事件,Android 多个include标签的监听事件处理
  4. MyEclipse中导入java文件出现乱码问题的解决方法
  5. python字符串截取拼接_Python字符串拼接、截取及替换方法总结分析
  6. head first servlet jsp 学习笔记
  7. STM32上使用JSON
  8. 基于Teigha.Net实现CAD到SHP的转换方案
  9. Spring Boot学习总结(1)——Spring Boot入门
  10. 想跟大家一起做件小事
  11. 2021年中国物流科技行业投融资现状及未来发展前景分析[图]
  12. matlab 函数pdf怎么用_PDF剪裁页面工具怎么用?怎么剪裁PDF页面
  13. 当div的宽度为百分比时,如何设置成为一个正方形?
  14. bochs在安卓上模拟kali linux系统
  15. 我的世界服务器增加刷怪率,我的世界:最简易刷怪空间,别再暴殄天物了!
  16. 数学建模论文写作学习——数模论文概述
  17. 无线Mesh网络简介
  18. 关于电脑WLAN突然消失
  19. git 强行替换覆盖master分支
  20. Ancient Message (古埃及象形文字识别 Uva 1103)

热门文章

  1. codeforces Cable Connection
  2. 服务器性能指标(二)——CPU利用率分析及问题排查
  3. JavaScript原生添加移除class的方法
  4. Java Servlet总结
  5. 对于这款APP,我充了个终身VIP!!!
  6. 老师,我们想看到您的笑容!
  7. 常见的时间复杂度函数
  8. 转-Apache kafka 工作原理介绍
  9. 轮播有可能出现的问题
  10. java如何查看调用记录_查看Java记录