2023年7月4日发(作者:)
产品原型⽰例_原型设计模式⽰例产品原型⽰例本⽂是我们名为“ ”的学院课程的⼀部分。在本课程中,您将深⼊研究⼤量的设计模式,并了解如何在Java中实现和利⽤它们。 您将了解模式如此重要的原因,并了解何时以及如何应⽤模式中的每⼀个。 !
⽬录1.简介在⾯向对象编程中,您需要使⽤对象。 对象彼此交互以完成⼯作。 但是有时候,创建沉重的对象可能会变得很昂贵,并且如果您的应⽤程序需要太多此类对象(包含⼏乎相似的属性),则可能会带来⼀些性能问题。让我们考虑⼀个应⽤程序需要某种访问控制的场景。 ⽤户可以根据提供给他们的访问权限来使⽤应⽤程序的功能。 例如,有些⽤户有权访问由应⽤程序⽣成的报告,⽽有些则不能。 他们中有些甚⾄可以修改报告,⽽有些只能读取报告。 ⼀些⽤户还具有添加或什⾄删除其他⽤户的管理权限。每个⽤户对象都有⼀个访问控制对象,⽤于提供或限制应⽤程序的控制。 此访问控制对象是⼀个笨重的对象,其创建⾮常昂贵,因为它需要从某些外部资源(例如数据库或某些属性⽂件等)中获取数据。我们也不能与同⼀级别的⽤户共享同⼀访问控制对象,因为管理员可以在运⾏时更改权限,并且同⼀级别的其他⽤户可以具有不同的访问控制。 ⼀个⽤户对象应具有⼀个访问控制对象。我们可以使⽤原型设计模式来解决此问题,⽅法是⼀次在所有级别上创建访问控制对象,然后在需要时向⽤户提供该对象的副本。 在这种情况下,从外部资源获取数据仅发⽣⼀次。 下次,通过复制现有对象来创建访问控制对象。 每次发送请求时,都不会从头开始创建访问控制对象; 这种⽅法肯定会减少对象创建时间。在深⼊探讨解决⽅案之前,请让我们进⼀步了解原型设计模式。2.什么是原型设计模式原型设计模式⽤于指定要使⽤原型实例创建的对象的种类,并通过复制此原型来创建新对象。其概念是复制现有对象,⽽不是从头开始创建新实例,这可能包括昂贵的操作。 现有对象充当原型,并包含对象的状态。 仅在需要时,新复制的对象才能更改相同的属性。 这种⽅法节省了昂贵的资源和时间,尤其是在对象创建很繁重的过程中。在Java中,有某些⽅法可以复制对象以创建⼀个新对象。 实现此⽬的的⼀种⽅法是使⽤Cloneable接⼝。 Java提供了clone⽅法,该⽅法从Object类继承Object 。 您需要实现Cloneable接⼝,并根据需要覆盖此clone⽅法。图1原型声明⼀个⽤于克隆⾃⾝的接⼝。具体原型实现克隆⾃⾝的操作。客户通过要求原型克隆⾃⼰来创建新对象。原型使您只需通过向客户注册原型实例,就可以将新的具体产品类合并到系统中。3.解决问题在此解决⽅案中,我们将使⽤克隆⽅法来解决上述问题。package ypepattern;public interface Prototype extends Cloneable { public AccessControl clone() throws CloneNotSupportedException;}上⾯的接⼝扩展了Cloneable接⼝,并包含⽅法clone 。 该接⼝由要创建原型对象的类实现。package ypepattern;public class AccessControl implements Prototype{ private final String controlLevel; private String access; public AccessControl(String controlLevel,String access){ lLevel = controlLevel; = access; } @Override public AccessControl clone(){ try { return (AccessControl) (); } catch (CloneNotSupportedException e) { tackTrace(); } return null; } public String getControlLevel(){ return controlLevel; } public String getAccess() { return access; } public void setAccess(String access) { = access; }}AccessControl类实现Prototype接⼝并覆盖clone⽅法。 该⽅法调⽤超类的clone⽅法,并将对象向下转换为AccessControl类型后返回该对象。 clone⽅法将引发CloneNotSupportedException ,该⽅法本⾝会捕获该异常。该类还包含两个属性。 controlLevel⽤于指定此对象包含的控制级别。 级别取决于要使⽤它的⽤户类型,例如USER,ADMIN,MANAGER等。另⼀个属性是access ; 它包含⽤户的访问权限。 请注意,为简单起见,我们将访问权限⽤作String类型属性。 这可以是Map类型,可以包含分配给⽤户的长访问权限的键值对。package ypepattern;public class User { private String userName; private String level; private AccessControl accessControl; public User(String userName,String level, AccessControl accessControl){ me = userName; = level; Control = accessControl; } public String getUserName() { return userName; } public void setUserName(String userName) { me = userName; } public String getLevel() { return level; } public void setLevel(String level) { = level; } public AccessControl getAccessControl() { return accessControl; } public void setAccessControl(AccessControl accessControl) { Control = accessControl; } @Override public String toString(){ return "Name: "+userName+", Level: "+level+", Access Control Level:"+trolLevel()+", Access: "+ess(); }}User类具有userName , level和对分配给它的AccessControl的引⽤。我们使⽤了⼀个AccessControlProvider类,该类预先创建和存储可能的AccessControl对象。 当有对AccessControl对象的请求时,它返回⼀个通过复制存储的原型创建的新对象。package ypepattern;import p;import ;public class AccessControlProvider { private static Map
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688436496a137574.html
评论列表(0条)