产品原型示例_原型设计模式示例
產(chǎn)品原型示例
本文是我們名為“ Java設(shè)計(jì)模式 ”的學(xué)院課程的一部分。
在本課程中,您將深入研究大量的設(shè)計(jì)模式,并了解如何在Java中實(shí)現(xiàn)和利用它們。 您將了解模式如此重要的原因,并了解何時(shí)以及如何應(yīng)用模式中的每一個(gè)。 在這里查看 !
目錄
1.簡介 2.什么是原型設(shè)計(jì)模式 3.解決問題 4.何時(shí)使用原型設(shè)計(jì)模式 5. JDK中的原型模式 6.下載源代碼1.簡介
在面向?qū)ο缶幊讨?#xff0c;您需要使用對(duì)象。 對(duì)象彼此交互以完成工作。 但是有時(shí)候,創(chuàng)建沉重的對(duì)象可能會(huì)變得很昂貴,并且如果您的應(yīng)用程序需要太多此類對(duì)象(包含幾乎相似的屬性),則可能會(huì)帶來一些性能問題。
讓我們考慮一個(gè)應(yīng)用程序需要某種訪問控制的場景。 用戶可以根據(jù)提供給他們的訪問權(quán)限來使用應(yīng)用程序的功能。 例如,有些用戶有權(quán)訪問由應(yīng)用程序生成的報(bào)告,而有些則不能。 他們中有些甚至可以修改報(bào)告,而有些只能讀取報(bào)告。 一些用戶還具有添加或什至刪除其他用戶的管理權(quán)限。
每個(gè)用戶對(duì)象都有一個(gè)訪問控制對(duì)象,用于提供或限制應(yīng)用程序的控制。 此訪問控制對(duì)象是一個(gè)笨重的對(duì)象,其創(chuàng)建非常昂貴,因?yàn)樗枰獜哪承┩獠抠Y源(例如數(shù)據(jù)庫或某些屬性文件等)中獲取數(shù)據(jù)。
我們也不能與同一級(jí)別的用戶共享同一訪問控制對(duì)象,因?yàn)楣芾韱T可以在運(yùn)行時(shí)更改權(quán)限,并且同一級(jí)別的其他用戶可以具有不同的訪問控制。 一個(gè)用戶對(duì)象應(yīng)具有一個(gè)訪問控制對(duì)象。
我們可以使用原型設(shè)計(jì)模式來解決此問題,方法是一次在所有級(jí)別上創(chuàng)建訪問控制對(duì)象,然后在需要時(shí)向用戶提供該對(duì)象的副本。 在這種情況下,從外部資源獲取數(shù)據(jù)僅發(fā)生一次。 下次,通過復(fù)制現(xiàn)有對(duì)象來創(chuàng)建訪問控制對(duì)象。 每次發(fā)送請(qǐng)求時(shí),都不會(huì)從頭開始創(chuàng)建訪問控制對(duì)象; 這種方法肯定會(huì)減少對(duì)象創(chuàng)建時(shí)間。
在深入探討解決方案之前,請(qǐng)讓我們進(jìn)一步了解原型設(shè)計(jì)模式。
2.什么是原型設(shè)計(jì)模式
原型設(shè)計(jì)模式用于指定要使用原型實(shí)例創(chuàng)建的對(duì)象的種類,并通過復(fù)制此原型來創(chuàng)建新對(duì)象。
其概念是復(fù)制現(xiàn)有對(duì)象,而不是從頭開始創(chuàng)建新實(shí)例,這可能包括昂貴的操作。 現(xiàn)有對(duì)象充當(dāng)原型,并包含對(duì)象的狀態(tài)。 僅在需要時(shí),新復(fù)制的對(duì)象才能更改相同的屬性。 這種方法節(jié)省了昂貴的資源和時(shí)間,尤其是在對(duì)象創(chuàng)建很繁重的過程中。
在Java中,有某些方法可以復(fù)制對(duì)象以創(chuàng)建一個(gè)新對(duì)象。 實(shí)現(xiàn)此目的的一種方法是使用Cloneable接口。 Java提供了clone方法,該方法從Object類繼承Object 。 您需要實(shí)現(xiàn)Cloneable接口,并根據(jù)需要覆蓋此clone方法。
圖1
原型
- 聲明一個(gè)用于克隆自身的接口。
具體原型
- 實(shí)現(xiàn)克隆自身的操作。
客戶
- 通過要求原型克隆自己來創(chuàng)建新對(duì)象。
原型使您只需通過向客戶注冊原型實(shí)例,就可以將新的具體產(chǎn)品類合并到系統(tǒng)中。
3.解決問題
在此解決方案中,我們將使用克隆方法來解決上述問題。
package com.javacodegeeks.patterns.prototypepattern;public interface Prototype extends Cloneable {public AccessControl clone() throws CloneNotSupportedException;}上面的接口擴(kuò)展了Cloneable接口,并包含方法clone 。 該接口由要?jiǎng)?chuàng)建原型對(duì)象的類實(shí)現(xiàn)。
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類實(shí)現(xiàn)Prototype接口并覆蓋clone方法。 該方法調(diào)用超類的clone方法,并將對(duì)象向下轉(zhuǎn)換為AccessControl類型后返回該對(duì)象。 clone方法將引發(fā)CloneNotSupportedException ,該方法本身會(huì)捕獲該異常。
該類還包含兩個(gè)屬性。 controlLevel用于指定此對(duì)象包含的控制級(jí)別。 級(jí)別取決于要使用它的用戶類型,例如USER,ADMIN,MANAGER等。
另一個(gè)屬性是access ; 它包含用戶的訪問權(quán)限。 請(qǐng)注意,為簡單起見,我們將訪問權(quán)限用作String類型屬性。 這可以是Map類型,可以包含分配給用戶的長訪問權(quán)限的鍵值對(duì)。
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和對(duì)分配給它的AccessControl的引用。
我們使用了一個(gè)AccessControlProvider類,該類預(yù)先創(chuàng)建和存儲(chǔ)可能的AccessControl對(duì)象。 當(dāng)有對(duì)AccessControl對(duì)象的請(qǐng)求時(shí),它返回一個(gè)通過復(fù)制存儲(chǔ)的原型創(chuàng)建的新對(duì)象。
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方法根據(jù)傳遞給它的controlLevel提取存儲(chǔ)的原型對(duì)象,并將新創(chuàng)建的克隆對(duì)象返回到客戶端代碼。
現(xiàn)在,讓我們測試代碼。
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);} }上面的代碼將產(chǎn)生以下輸出:
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級(jí)別創(chuàng)建了一個(gè)AccessControl對(duì)象,并將其分配給UserA。然后,又將另一個(gè)AccessControl對(duì)象分配給User B,但是這次我們更改了User B的訪問權(quán)限。最后,MANAGER用戶C的級(jí)別訪問控制。
getAccessControlObject用于獲取AccessControl對(duì)象的新副本,當(dāng)我們更改用戶B的訪問權(quán)限時(shí),可以清楚地看到這一點(diǎn),而用戶A的訪問權(quán)限沒有更改(只需再次打印用戶A對(duì)象)。 這確認(rèn)clone方法工作正常,因?yàn)樗祷貙?duì)象的新副本,而不是指向同一對(duì)象的引用。
4.何時(shí)使用原型設(shè)計(jì)模式
當(dāng)系統(tǒng)應(yīng)獨(dú)立于其產(chǎn)品的創(chuàng)建,組成和表示方式時(shí),請(qǐng)使用Prototype模式。 和
- 在運(yùn)行時(shí)指定要實(shí)例化的類時(shí),例如,通過動(dòng)態(tài)加載; 要么
- 為了避免建立與產(chǎn)品的類層次結(jié)構(gòu)平行的工廠的類層次結(jié)構(gòu); 要么
- 當(dāng)類的實(shí)例只能具有幾種不同的狀態(tài)組合之一時(shí)。 每次都以適當(dāng)?shù)臓顟B(tài)安裝相應(yīng)數(shù)量的原型并克隆它們,而不是手動(dòng)實(shí)例化類,可能會(huì)更方便。
5. JDK中的原型模式
- java.lang.Object#clone()
- java.lang.Cloneable
6.下載源代碼
這是關(guān)于原型設(shè)計(jì)模式的課程。 您可以在此處下載源代碼: PrototypePattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/prototype-design-pattern.html
產(chǎn)品原型示例
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的产品原型示例_原型设计模式示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单例模式示例_单例设计模式示例
- 下一篇: cdr图层锁定快捷键(cdr上移一层快捷