设计模式——原型模式
個人在CSDN上的BLOG:http://blog.csdn.net/feb13/article/details/7851293
以下是讀《設(shè)計模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ)》的讀書筆記。
PROTOTYPE 原型
?
1、 意圖
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。
2、 適用性
- 當(dāng)一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成、表示時,要使用Prototype模式;
- 當(dāng)要實例化的類是在運行時刻制定時。例如,通過動態(tài)裝載;
- 為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時;
- ?當(dāng)一個類的實例只能有幾個不同狀態(tài)組合中的一種時。
3、 結(jié)構(gòu)
4、 參與者
Prototype
??????????????????? ——聲明一個克隆自身的接口。
ConcretePrototype
??????????????????? ——實現(xiàn)一個克隆自身的操作。
Client
??????????????????? ——讓一個原型克隆自身從而創(chuàng)建一個新的對象。
5、 協(xié)作
客戶請求一個原型克隆自身。
6、 效果
Prototype有許多和Abstract Factory和Builder一樣的效果:它對客戶隱藏了具體的產(chǎn)品類,因此減少了客戶知道的名字的數(shù)目。此外,這些模式使客戶無需改變即可使用與特定應(yīng)用相關(guān)的類。
Property還有以下優(yōu)點:
1)運行時刻增加和刪除產(chǎn)品????????????????? Prototype允許只通過客戶注冊原型實例就可以將一個新的具體產(chǎn)品類并入系統(tǒng)。它比其他創(chuàng)建型模式更靈活,因為客戶可以在運行時刻建立和刪除原型。
2)改變值以指定新對象????????????????? 高度動態(tài)的系統(tǒng)允許你通過對象復(fù)合定義新的行為。
3)改變結(jié)構(gòu)以指定新對象????????????
4)減少子類的構(gòu)造????????????????? Factory Method經(jīng)常產(chǎn)生一個與產(chǎn)品類層次平行的Creator類層次。Prototype模式使得你克隆一個原型而不是請求一個工廠方法去產(chǎn)生一個新的對象。因此你根本不需要Creator類層次。
5)用動態(tài)類配置應(yīng)用???????????? 一些運行時刻環(huán)境允許你動態(tài)將類裝載到應(yīng)用中。一個希望創(chuàng)建動態(tài)載入類的實例的應(yīng)用不能靜態(tài)引用類的構(gòu)造器。而應(yīng)該由運行環(huán)境在載入時自動創(chuàng)建每個類的實例,并用原型管理器來注冊這個實例。
Prototype的主要缺陷是每一個Prototype的子類都必須實現(xiàn)Clone()操作,這可能很困難。例如,當(dāng)所考慮的類已經(jīng)存在時就難以新增Clone操作。當(dāng)內(nèi)部包括一些不支持拷貝或有循環(huán)引用的對象時,實現(xiàn)克隆可能也會很難。
7、 實現(xiàn)
實現(xiàn)原型時,要考慮下面問題:
1)使用一個原型管理器??????? 當(dāng)一個系統(tǒng)中原型數(shù)目不固定時(也就是說,它們可以動態(tài)創(chuàng)建和銷毀),要保持一個可用原型的注冊表。客戶不會自己來管理原型,但會在注冊表中存儲和檢索原型。客戶在克隆一個原型前會向注冊表請求該原型。
2)實現(xiàn)克隆操作???????????? Prototype模式最困難的部分在于正確實現(xiàn)clone操作。當(dāng)對象結(jié)構(gòu)包含循環(huán)引用時,這尤為棘手。克隆一個結(jié)構(gòu)復(fù)雜的原型通常需要深拷貝,因為復(fù)制對象和原對象必須相互獨立。
3)初始化克隆對象???????
8、 代碼示例
Prototype
package com.examples.pattern.prototype;publicclass Prototype implements Cloneable {private String name;public String getName() {returnname;}publicvoid setName(String name) {this.name = name;}public Object clone(){try {returnsuper.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();returnnull;}} } ConcretePrototypepackage com.examples.pattern.prototype;publicclass ConcretePrototype extends Prototype {public ConcretePrototype(String name) {setName(name);}}
Client
package com.examples.pattern.prototype;publicclass Client {publicstaticvoid main(String[] args) {Prototype pro = new ConcretePrototype("prototype");Prototype pro2 = (Prototype) pro.clone();System.out.println(pro.getName());System.out.println(pro2.getName());}}9、 相關(guān)模式
Prototype和Abstract Factory模式在某種方面是相互競爭的。但是它們也可以一起使用。Abstract Factory可以存儲一個被克隆的原型的集合,并且返回產(chǎn)品對象。
大量使用Composite和Decorator模式的設(shè)計通常也可以從Prototype模式處獲益。
?
轉(zhuǎn)載于:https://blog.51cto.com/guanzhenxing/973003
總結(jié)
以上是生活随笔為你收集整理的设计模式——原型模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】考虑virtual函数以外的其
- 下一篇: java 程序中打开文件和文件夹