产品原型示例_原型设计模式示例
产品原型示例
本文是我们名为“ Java设计模式 ”的学院课程的一部分。
在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !
目录
- 1.简介 2.什么是原型设计模式 3.解决问题 4.何时使用原型设计模式 5. JDK中的原型模式 6.下载源代码
1.简介
在面向对象编程中,您需要使用对象。 对象彼此交互以完成工作。 但是有时候,创建沉重的对象可能会变得很昂贵,并且如果您的应用程序需要太多此类对象(包含几乎相似的属性),则可能会带来一些性能问题。
让我们考虑一个应用程序需要某种访问控制的场景。 用户可以根据提供给他们的访问权限来使用应用程序的功能。 例如,有些用户有权访问由应用程序生成的报告,而有些则不能。 他们中有些甚至可以修改报告,而有些只能读取报告。 一些用户还具有添加或什至删除其他用户的管理权限。
每个用户对象都有一个访问控制对象,用于提供或限制应用程序的控制。 此访问控制对象是一个笨重的对象,其创建非常昂贵,因为它需要从某些外部资源(例如数据库或某些属性文件等)中获取数据。
我们也不能与同一级别的用户共享同一访问控制对象,因为管理员可以在运行时更改权限,并且同一级别的其他用户可以具有不同的访问控制。 一个用户对象应具有一个访问控制对象。
我们可以使用原型设计模式来解决此问题,方法是一次在所有级别上创建访问控制对象,然后在需要时向用户提供该对象的副本。 在这种情况下,从外部资源获取数据仅发生一次。 下次,通过复制现有对象来创建访问控制对象。 每次发送请求时,都不会从头开始创建访问控制对象; 这种方法肯定会减少对象创建时间。
在深入探讨解决方案之前,请让我们进一步了解原型设计模式。
2.什么是原型设计模式
原型设计模式用于指定要使用原型实例创建的对象的种类,并通过复制此原型来创建新对象。
其概念是复制现有对象,而不是从头开始创建新实例,这可能包括昂贵的操作。 现有对象充当原型,并包含对象的状态。 仅在需要时,新复制的对象才能更改相同的属性。 这种方法节省了昂贵的资源和时间,尤其是在对象创建很繁重的过程中。
在Java中,有某些方法可以复制对象以创建一个新对象。 实现此目的的一种方法是使用Cloneable
接口。 Java提供了clone
方法,该方法从Object
类继承Object
。 您需要实现Cloneable
接口,并根据需要覆盖此clone
方法。
图1
原型
- 声明一个用于克隆自身的接口。
具体原型
- 实现克隆自身的操作。
客户
- 通过要求原型克隆自己来创建新对象。
原型使您只需通过向客户注册原型实例,就可以将新的具体产品类合并到系统中。
3.解决问题
在此解决方案中,我们将使用克隆方法来解决上述问题。
package com.javacodegeeks.patterns.prototypepattern;public interface Prototype extends Cloneable {public AccessControl clone() throws CloneNotSupportedException;}
上面的接口扩展了Cloneable
接口,并包含方法clone
。 该接口由要创建原型对象的类实现。
package com.javacodegeeks.patterns.prototypepattern;public class AccessControl implements Prototype{private final String controlLevel;private String access;public AccessControl(String controlLevel,String access){this.controlLevel = controlLevel;this.access = access;}@Overridepublic AccessControl clone(){try {return (AccessControl) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return null;}public String getControlLevel(){return controlLevel;}public String getAccess() {return access;}public void setAccess(String access) {this.access = access;}}
AccessControl
类实现Prototype
接口并覆盖clone
方法。 该方法调用超类的clone
方法,并将对象向下转换为AccessControl
类型后返回该对象。 clone
方法将引发CloneNotSupportedException
,该方法本身会捕获该异常。
该类还包含两个属性。 controlLevel
用于指定此对象包含的控制级别。 级别取决于要使用它的用户类型,例如USER,ADMIN,MANAGER等。
另一个属性是access
; 它包含用户的访问权限。 请注意,为简单起见,我们将访问权限用作String
类型属性。 这可以是Map
类型,可以包含分配给用户的长访问权限的键值对。
package com.javacodegeeks.patterns.prototypepattern;public class User {private String userName;private String level;private AccessControl accessControl;public User(String userName,String level, AccessControl accessControl){this.userName = userName;this.level = level;this.accessControl = accessControl;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getLevel() {return level;}public void setLevel(String level) {this.level = level;}public AccessControl getAccessControl() {return accessControl;}public void setAccessControl(AccessControl accessControl) {this.accessControl = accessControl;}@Overridepublic String toString(){return "Name: "+userName+", Level: "+level+", Access Control Level:"+accessControl.getControlLevel()+", Access: "+accessControl.getAccess();}}
User
类具有userName
, level
和对分配给它的AccessControl
的引用。
我们使用了一个AccessControlProvider
类,该类预先创建和存储可能的AccessControl
对象。 当有对AccessControl
对象的请求时,它返回一个通过复制存储的原型创建的新对象。
package com.javacodegeeks.patterns.prototypepattern;import java.util.HashMap;
import java.util.Map;public class AccessControlProvider {private static Map<String, AccessControl>map = new HashMap<String, AccessControl>();static{System.out.println("Fetching data from external resources and creating access control objects...");map.put("USER", new AccessControl("USER","DO_WORK"));map.put("ADMIN", new AccessControl("ADMIN","ADD/REMOVE USERS"));map.put("MANAGER", new AccessControl("MANAGER","GENERATE/READ REPORTS"));map.put("VP", new AccessControl("VP","MODIFY REPORTS"));}public static AccessControl getAccessControlObject(String controlLevel){AccessControl ac = null;ac = map.get(controlLevel);if(ac!=null){return ac.clone();}return null;}
}
getAccessControlObject
方法根据传递给它的controlLevel
提取存储的原型对象,并将新创建的克隆对象返回到客户端代码。
现在,让我们测试代码。
package com.javacodegeeks.patterns.prototypepattern;public class TestPrototypePattern {public static void main(String[] args) {AccessControl userAccessControl = AccessControlProvider.getAccessControlObject("USER");User user = new User("User A", "USER Level", userAccessControl);System.out.println("************************************");System.out.println(user);userAccessControl = AccessControlProvider.getAccessControlObject("USER");user = new User("User B", "USER Level", userAccessControl);System.out.println("Changing access control of: "+user.getUserName());user.getAccessControl().setAccess("READ REPORTS");System.out.println(user);System.out.println("************************************");AccessControl managerAccessControl = AccessControlProvider.getAccessControlObject("MANAGER");user = new User("User C", "MANAGER Level", managerAccessControl);System.out.println(user);}
}
上面的代码将产生以下输出:
Fetching data from external resources and creating access control objects...
************************************
Name: User A, Level: USER Level, Access Control Level:USER, Access: DO_WORK
Changing access of: User B
Name: User B, Level: USER Level, Access Control Level:USER, Access: READ REPORTS
************************************
Name: User C, Level: MANAGER Level, Access Control Level:MANAGER, Access: GENERATE/READ REPORTS
在上面的代码中,我们在USER级别创建了一个AccessControl
对象,并将其分配给UserA。然后,又将另一个AccessControl
对象分配给User B,但是这次我们更改了User B的访问权限。最后,MANAGER用户C的级别访问控制。
getAccessControlObject
用于获取AccessControl
对象的新副本,当我们更改用户B的访问权限时,可以清楚地看到这一点,而用户A的访问权限没有更改(只需再次打印用户A对象)。 这确认clone
方法工作正常,因为它返回对象的新副本,而不是指向同一对象的引用。
4.何时使用原型设计模式
当系统应独立于其产品的创建,组成和表示方式时,请使用Prototype模式。 和
- 在运行时指定要实例化的类时,例如,通过动态加载; 要么
- 为了避免建立与产品的类层次结构平行的工厂的类层次结构; 要么
- 当类的实例只能具有几种不同的状态组合之一时。 每次都以适当的状态安装相应数量的原型并克隆它们,而不是手动实例化类,可能会更方便。
5. JDK中的原型模式
java.lang.Object#clone()
java.lang.Cloneable
6.下载源代码
这是关于原型设计模式的课程。 您可以在此处下载源代码: PrototypePattern-Project
翻译自: https://www.javacodegeeks.com/2015/09/prototype-design-pattern.html
产品原型示例
产品原型示例_原型设计模式示例相关推荐
- 设计模式示例_桥梁设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- 设计模式示例_代理设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- 设计模式示例_状态设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- 设计模式示例_命令设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- 设计模式示例_介体设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- 设计模式示例_复合设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- swagger生成示例_生成器设计模式示例
swagger生成示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...
- 子模板继承父模板示例_模板设计模式示例
子模板继承父模板示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重 ...
- java 观察者模式示例_观察者设计模式示例
java 观察者模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...
- java原型链_原型链的使用
这段时间突然有点了解了原型的方法然后看了这个文章感觉很详细,就记录一下 原型对象 每个javascript对象都有一个原型对象,这个对象在不同的解释器下的实现不同.比如在firefox下,每个对象都有 ...
最新文章
- jemeter监听器的使用
- [转] 在Mac上搭建React Native开发环境
- 面试再问值传递与引用传递,把这篇文章砸给他!
- tls 禁用重协商_SSL/TLS高危不安全重新协商漏洞
- c语言程序设计第4版pdf荣政_C语言程序设计(第4版) (史蒂芬.寇肯) 中文pdf扫描版[82MB]...
- Python 操作 MySQL 数据库
- 等式约束和不等式约束下的KKT条件求法
- One order text browser tool
- 批处理--创建当前日期的文件夹
- 类模板与运算符重载(一个简单的例子)
- python编译器如何设置中文_如何使setup.py test使用特定的fortran编译器?
- Java判断两个Date是不是同一天
- 前端学习(848):为什么学习节点操作和节点简介
- sdp ddp内存怎么分_旗舰手机跑分66万+,缩短与PC差距,手机成生产力工具也许不是梦...
- matlab多目标遗传算法工具箱,运用MATLAB遗传算法工具箱求解非线性多目标优化问题,...
- java.util.zip.ZipException: only DEFLATED entries can have EXT descriptor
- 给马云、马化腾订制旅行,这家公司想做旅游行业的“得到”
- PHP算法之杨辉三角
- win10计算机右键属性打不开,win10电脑系统属性打不开的解决方法
- 关于state和status
热门文章
- 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】
- CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
- P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
- P4338-[ZJOI2018]历史【LCT】
- jzoj3845-简单题【dp】
- P2217-[HAOI2007]分割矩阵【dfs,记忆化搜索】
- jzoj3801-[NOIP2014模拟8.23]骰子【数学期望】
- 【递归】桐桐的递归函数
- 【并查集】团伙(luogu 1892)
- CF1088F Ehab and a weird weight formula(树上最优性问题、贪心+倍增)