产品原型示例_原型设计模式示例

产品原型示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是原型设计模式 3.解决问题 4.何时使用原型设计模式 5. JDK中的原型模式 6.下载源代码

1.简介

在面向对象编程中,您需要使用对象。 对象彼此交互以完成工作。 但是有时候,创建沉重的对象可能会变得很昂贵,并且如果您的应用程序需要太多此类对象(包含几乎相似的属性),则可能会带来一些性能问题。

让我们考虑一个应用程序需要某种访问控制的场景。 用户可以根据提供给他们的访问权限来使用应用程序的功能。 例如,有些用户有权访问由应用程序生成的报告,而有些则不能。 他们中有些甚至可以修改报告,而有些只能读取报告。 一些用户还具有添加或什至删除其他用户的管理权限。

每个用户对象都有一个访问控制对象,用于提供或限制应用程序的控制。 此访问控制对象是一个笨重的对象,其创建非常昂贵,因为它需要从某些外部资源(例如数据库或某些属性文件等)中获取数据。

我们也不能与同一级别的用户共享同一访问控制对象,因为管理员可以在运行时更改权限,并且同一级别的其他用户可以具有不同的访问控制。 一个用户对象应具有一个访问控制对象。

我们可以使用原型设计模式来解决此问题,方法是一次在所有级别上创建访问控制对象,然后在需要时向用户提供该对象的副本。 在这种情况下,从外部资源获取数据仅发生一次。 下次,通过复制现有对象来创建访问控制对象。 每次发送请求时,都不会从头开始创建访问控制对象; 这种方法肯定会减少对象创建时间。

在深入探讨解决方案之前,请让我们进一步了解原型设计模式。

2.什么是原型设计模式

原型设计模式用于指定要使用原型实例创建的对象的种类,并通过复制此原型来创建新对象。

其概念是复制现有对象,而不是从头开始创建新实例,这可能包括昂贵的操作。 现有对象充当原型,并包含对象的状态。 仅在需要时,新复制的对象才能更改相同的属性。 这种方法节省了昂贵的资源和时间,尤其是在对象创建很繁重的过程中。

在Java中,有某些方法可以复制对象以创建一个新对象。 实现此目的的一种方法是使用Cloneable接口。 Java提供了clone方法,该方法从Object类继承Object 。 您需要实现Cloneable接口,并根据需要覆盖此clone方法。

class_diagram_1

图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类具有userNamelevel和对分配给它的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

产品原型示例

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

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

相关文章

13 年,MySQL 之父赌赢了:另起炉灶的 MariaDB 成功上市!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络&#xff0c;侵权删&#xff01;今年 2 月&#xff0c;开源数据库厂商 MariaDB 完成了 1.04 亿美元的 D 轮融资&#xff0c;同…

太阳粒子是什么东西_太阳光子前世今生告诉我们现在享受之阳光是十几万年前诞生的老光...

我们都知道天晴时阳光明媚&#xff0c;但这个阳光是怎么来的呢&#xff0c;很多人就不一定清楚了。在这里我们首先来了解几个概念&#xff1a;光子、光、电磁波、电磁辐射。光子是传递电磁波相互作用的基本粒子&#xff0c;是一种规范波色子&#xff0c;是电磁辐射的载体&#…

java 观察者模式示例_观察者设计模式示例

java 观察者模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 …

int类型存小数 mysql_MySQL基本数据类型

1&#xff09;整形1.介绍分类&#xff1a;tinyint , smallint , mediumint , int , bigint 应用场景&#xff1a;存储年龄&#xff0c;等级&#xff0c;id&#xff0c;各种号码等典型存储范围介绍:https://images2017.cnblogs.com/blog/1036857/201708/1036857-201708011814337…

枚举重名_举重设计模式示例

枚举重名本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01…

装饰着模式示例_装饰器设计模式示例

装饰着模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &…

强烈推荐!10个超赞的C语言开源项目

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络今天给大家分享10个超赞的C语言开源项目&#xff0c;希望这些内容能对大家有所帮助&#xff01;01WebbenchWebbench是一个在 L…

以外的文件 删除_原来C盘还可以删除这五个文件,难怪电脑越来越卡!

马上就要年底了&#xff0c;大家肯定都是欢欢喜喜准备过年&#xff0c;将家里变得焕然一新。韩博士也捯饬好大包小包打算风风火火赶回家&#xff0c;结果刚打开电脑&#xff0c;哦豁&#xff0c;立马卡到爆炸。想着都年底了&#xff0c;这电脑还打算给我搞出什么幺蛾子&#xf…

设计模式示例_复合设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

给大家收集了一些C语言代码优化的方法!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络在本篇文章中&#xff0c;我收集了很多经验和方法。应用这些经验和方法&#xff0c;可以帮助我们从执行速度和内存使用等方面来…

设计模式示例_介体设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

清空list_还在为邮箱爆掉而烦恼吗?学会清空你的收件箱

less is more | 越不繁&#xff0c;越不凡还在为邮箱爆掉而烦恼吗&#xff1f;学会清空你的收件箱我一般只用Gmail收发邮件&#xff0c;而且处理邮件已经成为日常工作的核心之一。我每个小时能收到大量邮件&#xff0c;并且快速回复。但是&#xff0c;有一件事要特别提一下&…

这才是B站的正确打开方式!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络每天都在用B站刷杂七杂八的视频&#xff0c;有没有考虑过挖掘一些优质UP主&#xff1f;想要发掘优质UP主&#xff0c;靠B站官方…

pcl_openmap_OpenMap教程–第1部分

pcl_openmap介绍 本系列教程将向您展示如何使用OpenMap GIS Java Swing库构建Java应用程序。 OpenMap的开发人员指南是非常有用的文档&#xff0c;描述了OpenMap的体系结构&#xff0c;但没有说明如何逐步启动和构建应用程序。 源代码附带的示例很有用&#xff0c;但还不够。 …

网页编程从入门到精通 杨凡_干货 | web前端入门基础知识

一名合格的web前端工程师必须得掌握HTML、CSS和JavaScript。只懂其中一个或两个还不行&#xff0c;你必须对这三门语言都很熟悉。也不是说必须对这三门语言都非常精通&#xff0c;但你至少要能够运用它们完成大多数任务&#xff0c;而无需地频繁地寻求别人的帮助。今天给大家分…

100 个网络基础知识

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络1)什么是链接?链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。2)OSI 参考模型的层次…

策略模式示例代码_策略设计模式示例

策略模式示例代码本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &am…

加白名单_Android保活从入门到放弃:乖乖引导用户加白名单吧

1、引言IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论&#xff0c;自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见《Android P正式版即将到来&#xff1a;后台应用保活、消息推送的真正噩梦》)&#xff0c;保活从黑科技横行的时代进入了技术…

子模板继承父模板示例_模板设计模式示例

子模板继承父模板示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看…

10个超赞的C语言开源项目!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删今天分享10个超赞的C语言开源项目&#xff0c;希望这些内容能对大家有所帮助&#xff01;目录&#xff1a;1. Webbench2. Tinyhttpd3. cJSON4. C…