宣告一下:本文的文字多數文字都是來自網上,只有例子是自己寫的。因為自我感覺還沒有能力能夠系統的解釋乙個模式,已經有現成的比較完善的說明,就不重複造輪子哈。
原型模式是一種建立型設計模式,它通過複製乙個已經存在的例項來返回新的例項,而不是新建例項.被複製的例項就是我們所稱的原型,這個原型是可定製的。
原型模式多用於建立複雜的或者耗時的例項, 因為這種情況下,複製乙個已經存在的例項可以使程式執行更高效,或者建立值相等,只是命名不一樣的同類資料。
適用場景
在以下情況下可以考慮使用原型模式:
(1) 建立新物件成本較大(如初始化需要占用較長的時間,占用太多的cpu資源或網路資源),新的物件可以通過原型模式對已有物件進行複製來獲得,如果是相似物件,則可以對其成員變數稍作修改。
(2) 如果系統要儲存物件的狀態,而物件的狀態變化很小,或者物件本身占用記憶體較少時,可以使用原型模式配合備忘錄模式來實現。
(3) 需要避免使用分層次的工廠類來建立分層次的物件,並且類的例項物件只有乙個或很少的幾個組合狀態,通過複製原型物件得到新例項可能比使用建構函式建立乙個新例項更加方便。
原型類圖:
例子:
淺複製:
prototype:
public class copyvalidater implements cloneable
public void setvalidater(validater validater)
public copyvalidater cloneable() catch (clonenotsupportedexception e)
return convalidater;}}
concreteprototype:
public class validater
public void setfieldname(string fieldname)
public string getoperater()
public void setoperater(string operater)
public object getdata()
public void setdata(object data)
public int getdatatype()
public void setdatatype(int datatype)
@override
public string tostring() ';}}
client:
public class main
}
結果集:
notcopy:validater
copy:validater
***********************************===修改後*********************************************=
notcopy:validater
copy:validater
深複製:
prototype:
public class copyvalidater implements cloneable
public void setvalidater(validater validater)
public copyvalidater cloneable() catch (clonenotsupportedexception e)
return convalidater;}}
concreteprototype:
public class validater implements cloneable
public void setfieldname(string fieldname)
public string getoperater()
public void setoperater(string operater)
public object getdata()
public void setdata(object data)
public int getdatatype()
public void setdatatype(int datatype)
public validater cloneable() catch (throwable e)
return validater;
}@override
public string tostring() ';}}
client:(與淺複製**相同)
public class main
}
結果集:
notcopy:validater
copy:validater
***********************************===修改後*********************************************=
notcopy:validater
copy:validater
根據深淺複製**,我們可以得出:
淺複製: 對值型別的成員變數進行值的複製,對引用型別的成員變數只複製引用,不複製引用的物件.
深複製: 對值型別的成員變數進行值的複製,對引用型別的成員變數也進行引用物件的複製.
原型模式作為一種快速建立大量相同或相似物件的方式,在軟體開發中應用較為廣泛,很多軟體提供的複製(ctrl + c)和貼上(ctrl + v)操作就是原型模式的典型應用,下面對該模式的使用效果和適用情況進行簡單的總結。
1.優點
(1) 當建立新的物件例項較為複雜時,使用原型模式可以簡化物件的建立過程,通過複製乙個已有例項可以提高新例項的建立效率。
(2) 擴充套件性較好,由於在原型模式中提供了抽象原型類,在客戶端可以針對抽象原型類進行程式設計,而將具體原型類寫在配置檔案中,增加或減少產品類對原有系統都沒有任何影響。
(3) 原型模式提供了簡化的建立結構,工廠方法模式常常需要有乙個與產品類等級結構相同的工廠等級結構,而原型模式就不需要這樣,原型模式中產品的複製是通過封裝在原型類中的轉殖方法實現的,無須專門的工廠類來建立產品。
(4) 可以使用深轉殖的方式儲存物件的狀態,使用原型模式將物件複製乙份並將其狀態儲存起來,以便在需要的時候使用(如恢復到某一歷史狀態),可輔助實現撤銷操作。
2.缺點
原型模式的主要缺點如下:
(1) 需要為每乙個類配備乙個轉殖方法,而且該轉殖方法位於乙個類的內部,當對已有的類進行改造時,需要修改源**,違背了「開閉原則」。
(2) 在實現深轉殖時需要編寫較為複雜的**,而且當物件之間存在多重的巢狀引用時,為了實現深轉殖,每一層物件對應的類都必須支援深轉殖,實現起來可能會比較麻煩。
建立型設計模式 原型模式
總結 羊 program ade someproblem author cade franklin create 2019 12 22 22 12 public class sheep tostring setter getter program ade someproblem author cad...
設計模式(建立型) 原型模式
原型模式的定義 以乙個已經建立的例項作為原型,通過複製該物件來建立乙個和原型相同或相似的新物件。1.複製在效能上比直接 new 乙個物件更加優良。2.可以使用深拷貝方式儲存物件的狀態,使用原型模式將物件複製乙份,並將其狀態儲存起來,可輔助實現撤銷操作。1.需要為每乙個類配備乙個轉殖方法,對已有的類進...
原型模式 建立型設計模式四
一 原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。用例項來說話 我要發簡歷,自己寫了乙份模板,然後複製了n 份。如下 模板 class resume 客戶端 static void main string args 如果現在我想改,那就得把n份全改了,本來只是改動一點,卻...