设计模式 工厂方法_工厂设计模式–一种有效的方法
设计模式 工厂方法
如您所知,“工厂方法模式”或俗称“工厂设计模式”是“创意设计模式”类别下的一种设计模式。 模式背后的基本原理是,在运行时,我们根据传递的参数获得类似类型的对象。 关于这种模式的文章很多,开发人员可以通过各种方式来实现它。 在本文中,我将向您展示如何创建一种更好且最有效的工厂设计模式设计方法。
技术性
正如我已经告诉您的那样,在工厂设计的情况下,我们将在运行时获得一个类似类型的对象,这样,对象的基础实现将位于屏幕后面。 让我们考虑一个简单的方法。 让我们考虑一个可以是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 。
翻译自: https://www.javacodegeeks.com/2013/06/factory-design-pattern-an-effective-approach.html
设计模式 工厂方法
设计模式 工厂方法_工厂设计模式–一种有效的方法相关推荐
- 瓷砖铺贴方法_瓷砖的12种铺贴方法
1)菱形铺法 在正铺的基础上45°旋转的效果,注意因为后期切割的关系,损耗会略大,建议多买几片备用. 2)工宇铺(砖形铺贴) 最近几年比较流行的正方形工字铺,相较正铺,给人感觉线条更多变有趣. 3)人 ...
- getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...
文章系列目录(持续更新中): [设计模式]第一篇:概述.耦合.UML.七大原则,详细分析总结(基于Java) [设计模式]第二篇:单例模式的几种实现And反射对其的破坏 一 为什么要用工厂模式 之前讲 ...
- 设计模式 原型模式_原型设计模式:创建另一个小车
设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...
- java设计模式之美_《设计模式之美》-笔记
单例模式 单例模式实现方式 1.饿汉式 2.懒汉式 3.双重检测 4.静态内部类 5.枚举 单例模式存在的问题 单例对 OOP 特性的支持不友好 单例会隐藏类之间的依赖关系 单例对代码的扩展性不友好 ...
- java按两列输出_有没有一种简单的方法可以将两列输出到Java中的控制台? - java...
如标题所述,是否有一种简单的方法可以将两列输出到Java中的控制台? 我知道\t,但是在使用printf时,我还没有找到基于特定列进行空间分配的方法. 参考方案 使用宽度和精度说明符,将其设置为相同的 ...
- 常用的分隔符有哪三种_掌握这三种调漂方法,你想怎么钓就怎么钓,再也不用求人...
调漂对于刚学钓鱼的钓友来说是一件非常头痛的事情,每次钓鱼大部分时间都浪费在调漂上,总是感觉调不好,不是灵了就是钝了!那么问题到底出在哪呢?今天就和大家分享三种针对悬坠钓的调漂方法,看懂弄明白了,再也不 ...
- isfile方法_递归算法是一种直接或者间接调用自身函数或者方法的算法
http://blog.csdn.NET/wangjinyu501/article/details/8248492 原版 一.基本概念 递归算法是一种直接或者间接调用自身函数或者方法的算法.Java递 ...
- python方法_详细解读Python中的__init__()方法
__init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是__init__()参数值可以有多种形式. 因为有很多 ...
- html是以一种通用的方法来,c++ 有一种通用的方法来使函数模板适应为多态函数对象吗?...
我有一些功能模板,例如 template void foo(T); template void bar(T); // others 我需要将每一个传递给一种算法,它将被称为各种类型的算法. templ ...
- tp3 默认模块 默认方法_您需要了解的有关默认方法的所有信息
tp3 默认模块 默认方法 因此,默认方法是--昨天的新闻,对不对? 是的,但是使用了一年之后,积累了很多事实,我想将这些事实收集在一个地方,供刚开始使用它们的开发人员使用. 甚至有经验的人都可以找到 ...
最新文章
- 测量场效应晶体管(JFET) 2N3819
- 微软官方python教程下载-微软官方上线 Python 教程
- android include 点击事件,Android 多个include标签的监听事件处理
- MyEclipse中导入java文件出现乱码问题的解决方法
- python字符串截取拼接_Python字符串拼接、截取及替换方法总结分析
- head first servlet jsp 学习笔记
- STM32上使用JSON
- 基于Teigha.Net实现CAD到SHP的转换方案
- Spring Boot学习总结(1)——Spring Boot入门
- 想跟大家一起做件小事
- 2021年中国物流科技行业投融资现状及未来发展前景分析[图]
- matlab 函数pdf怎么用_PDF剪裁页面工具怎么用?怎么剪裁PDF页面
- 当div的宽度为百分比时,如何设置成为一个正方形?
- bochs在安卓上模拟kali linux系统
- 我的世界服务器增加刷怪率,我的世界:最简易刷怪空间,别再暴殄天物了!
- 数学建模论文写作学习——数模论文概述
- 无线Mesh网络简介
- 关于电脑WLAN突然消失
- git 强行替换覆盖master分支
- Ancient Message (古埃及象形文字识别 Uva 1103)