产品原型⽰例_原型设计模式⽰例
产品原型⽰例
本⽂是我们名为“ ”的学院课程的⼀部分。
在本课程中,您将深⼊研究⼤量的设计模式,并了解如何在Java中实现和利⽤它们。 您将了解模式如此重要的原因,并了解何时以及如何应⽤模式中的每⼀个。 !
⽬录
1.简介
在⾯向对象编程中,您需要使⽤对象。 对象彼此交互以完成⼯作。 但是有时候,创建沉重的对象可能会变得很昂贵,并且如果您的应⽤程序需要太多此类对象(包含⼏乎相似的属性),则可能会带来⼀些性能问题。
让我们考虑⼀个应⽤程序需要某种访问控制的场景。 ⽤户可以根据提供给他们的访问权限来使⽤应⽤程序的功能。 例如,有些⽤户有权访问由应⽤程序⽣成的报告,⽽有些则不能。 他们中有些甚⾄可以修改报告,⽽有些只能读取报告。 ⼀些⽤户还具有添加或什⾄删除其他⽤户的管理权限。
每个⽤户对象都有⼀个访问控制对象,⽤于提供或限制应⽤程序的控制。 此访问控制对象是⼀个笨重的对象,其创建⾮常昂贵,因为它需要从某些外部资源(例如数据库或某些属性⽂件等)中获取数据。
我们也不能与同⼀级别的⽤户共享同⼀访问控制对象,因为管理员可以在运⾏时更改权限,并且同⼀级别的其他⽤户可以具有不同的访问控制。 ⼀个⽤户对象应具有⼀个访问控制对象。
我们可以使⽤原型设计模式来解决此问题,⽅法是⼀次在所有级别上创建访问控制对象,然后在需要时向⽤户提供该对象的副本。 在这种情况下,从外部资源获取数据仅发⽣⼀次。 下次,通过复制现有对象来创建访问控制对象。 每次发送请求时,都不会从头开始创建访问控制对象; 这种⽅法肯定会减少对象创建时间。
在深⼊探讨解决⽅案之前,请让我们进⼀步了解原型设计模式。
2.什么是原型设计模式
原型设计模式⽤于指定要使⽤原型实例创建的对象的种类,并通过复制此原型来创建新对象。
其概念是复制现有对象,⽽不是从头开始创建新实例,这可能包括昂贵的操作。 现有对象充当原型,并包含对象的状态。 仅在需要时,新复制的对象才能更改相同的属性。 这种⽅法节省了昂贵的资源和
时间,尤其是在对象创建很繁重的过程中。
在Java中,有某些⽅法可以复制对象以创建⼀个新对象。 实现此⽬的的⼀种⽅法是使⽤Cloneable接⼝。 Java提供了clone⽅法,该⽅法从Object类继承Object 。 您需要实现Cloneable接⼝,并根据需要覆盖此clone⽅法。
图1
原型
声明⼀个⽤于克隆⾃⾝的接⼝。
具体原型
实现克隆⾃⾝的操作。
客户
通过要求原型克隆⾃⼰来创建新对象。
原型使您只需通过向客户注册原型实例,就可以将新的具体产品类合并到系统中。
3.解决问题
在此解决⽅案中,我们将使⽤克隆⽅法来解决上述问题。
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.access = access;
}
@Override
public 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类型,可以包含分配给⽤户的长访问权限的键值对。
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;
}
@Override
public String toString(){
return "Name: "+userName+", Level: "+level+", Access Control Level:"+ControlLevel()+", Access: "+Access(); }
}
User类具有userName , level和对分配给它的AccessControl的引⽤。
我们使⽤了⼀个AccessControlProvider类,该类预先创建和存储可能的AccessControl对象。 当有对AccessControl对象的请求时,它返回⼀个通过复制存储的原型创建的新对象。
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 ");
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 = (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 = AccessControlObject("USER");
User user = new User("User A", "USER Level", userAccessControl);
System.out.println("************************************");
System.out.println(user);
userAccessControl = AccessControlObject("USER");
user = new User("User B", "USER Level", userAccessControl);
System.out.println("Changing access control of: "+UserName());
System.out.println(user);
System.out.println("************************************");
AccessControl managerAccessControl = AccessControlObject("MANAGER");
user = new User("User C", "MANAGER Level", managerAccessControl);
System.out.println(user);
}
}
上⾯的代码将产⽣以下输出:
Fetching data from external resources and creating access
************************************
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.下载源代码
这是关于原型设计模式的课程。 您可以在此处下载源代码:
产品原型⽰例

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。