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

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

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 Mapmap = new HashMap(); static{ n("Fetching data from external resources and creating access "); ("USER", new AccessControl("USER","DO_WORK")); ("ADMIN", new AccessControl("ADMIN","ADD/REMOVE USERS")); ("MANAGER", new AccessControl("MANAGER","GENERATE/READ REPORTS")); ("VP", new AccessControl("VP","MODIFY REPORTS")); } public static AccessControl getAccessControlObject(String controlLevel){ AccessControl ac = null; ac = (controlLevel); if(ac!=null){ return (); } return null; }}getAccessControlObject⽅法根据传递给它的controlLevel提取存储的原型对象,并将新创建的克隆对象返回到客户端代码。现在,让我们测试代码。package ypepattern;public class TestPrototypePattern { public static void main(String[] args) { AccessControl userAccessControl = essControlObject("USER"); User user = new User("User A", "USER Level", userAccessControl); n("************************************"); n(user); userAccessControl = essControlObject("USER"); user = new User("User B", "USER Level", userAccessControl); n("Changing access control of: "+rName()); essControl().setAccess("READ REPORTS"); n(user); n("************************************"); AccessControl managerAccessControl = essControlObject("MANAGER"); user = new User("User C", "MANAGER Level", managerAccessControl); n(user); }}上⾯的代码将产⽣以下输出:Fetching data from external resources and creating access ************************************Name: User A, Level: USER Level, Access Control Level:USER, Access: DO_WORKChanging access of: User BName: 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中的原型模式#clone()ble6.下载源代码这是关于原型设计模式的课程。 您可以在此处下载源代码:产品原型⽰例

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688436496a137574.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信