設計模式——原型模式

我的在CSDN上的BLOG:http://blog.csdn.net/feb13/article/details/7851293java

如下是讀《設計模式——可複用面向對象軟件的基礎》的讀書筆記。設計模式

PROTOTYPE 原型ide

 

一、 意圖ui

用原型實例指定建立對象的種類,而且經過拷貝這些原型建立新的對象。this

二、 適用性.net

  • 當一個系統應該獨立於它的產品建立、構成、表示時,要使用Prototype模式;
  • 當要實例化的類是在運行時刻制定時。例如,經過動態裝載;
  • 爲了不建立一個與產品類層次平行的工廠類層次時;
  •  當一個類的實例只能有幾個不一樣狀態組合中的一種時。

三、 結構prototype


四、 參與者設計

Prototype
                   
——聲明一個克隆自身的接口。code

ConcretePrototype
                    ——實現一個克隆自身的操做。對象

Client
                    ——讓一個原型克隆自身從而建立一個新的對象。

五、 協做

客戶請求一個原型克隆自身。

六、 效果

Prototype有許多和Abstract Factory和Builder同樣的效果:它對客戶隱藏了具體的產品類,所以減小了客戶知道的名字的數目。此外,這些模式使客戶無需改變便可使用與特定應用相關的類。

Property還有如下優勢:

1)運行時刻增長和刪除產品                  Prototype容許只經過客戶註冊原型實例就能夠將一個新的具體產品類併入系統。它比其餘建立型模式更靈活,由於客戶能夠在運行時刻創建和刪除原型。

2)改變值以指定新對象                  高度動態的系統容許你經過對象複合定義新的行爲。

3)改變結構以指定新對象            

4)減小子類的構造                  Factory Method常常產生一個與產品類層次平行的Creator類層次。Prototype模式使得你克隆一個原型而不是請求一個工廠方法去產生一個新的對象。所以你根本不須要Creator類層次。

5)用動態類配置應用             一些運行時刻環境容許你動態將類裝載到應用中。一個但願建立動態載入類的實例的應用不能靜態引用類的構造器。而應該由運行環境在載入時自動建立每一個類的實例,並用原型管理器來註冊這個實例。

Prototype的主要缺陷是每個Prototype的子類都必須實現Clone()操做,這可能很困難。例如,當所考慮的類已經存在時就難以新增Clone操做。當內部包括一些不支持拷貝或有循環引用的對象時,實現克隆可能也會很難。

七、 實現

實現原型時,要考慮下面問題:

1)使用一個原型管理器        當一個系統中原型數目不固定時(也就是說,它們能夠動態建立和銷燬),要保持一個可用原型的註冊表。客戶不會本身來管理原型,但會在註冊表中存儲和檢索原型。客戶在克隆一個原型前會向註冊表請求該原型。

2)實現克隆操做             Prototype模式最困難的部分在於正確實現clone操做。當對象結構包含循環引用時,這尤其棘手。克隆一個結構複雜的原型一般須要深拷貝,由於複製對象和原對象必須相互獨立。

3)初始化克隆對象       

八、 代碼示例

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;
       }
    }
}
ConcretePrototype
package 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());

    }

}

九、 相關模式

Prototype和Abstract Factory模式在某種方面是相互競爭的。可是它們也能夠一塊兒使用。Abstract Factory能夠存儲一個被克隆的原型的集合,而且返回產品對象。

大量使用Composite和Decorator模式的設計一般也能夠從Prototype模式處獲益。

相關文章
相關標籤/搜索