建立型模式之原型模式

2021-10-23 07:29:01 字數 3309 閱讀 8269

1、概述:通過給出乙個原型物件來指明所要建立的物件的型別,利用這個原型物件來建立更多相似的統一型別的物件但又不是同乙個物件(,世界上可能有千千萬萬個人,但你就是你,你是獨一無二的,顏色不一樣的花火,你是最棒的),因為如果直接建立物件的話,代價可能就會比較大,它屬於建立型模式的一種,它提供了一種建立物件的最佳方法。

2、介紹:

意圖:通過已建立的物件,我們知道要建立的物件型別,並且通過拷貝這些物件,就避免了直接建立物件的開銷,節省了系統資源。原型模式是用於建立重複的物件,同時又保證效能,這種設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

解決問題:避免頻繁的建立和刪除資源消耗較大的物件,或者需要建立非常多的物件,比如資料庫連線,細胞**等等

3、使用場景:

1、資源優化

2、初始化消耗資源較多,比如new物件,就包括硬體資源和資料等

3、對效能和安全要求較高的場景

4、需要短時間建立非常多的的物件

5、對於需要頻繁進行新建和銷毀操作的物件

4、內部實現的方式:因為類的初始化比較複雜,所以我們可以通過實現cloneable介面,實現了淺複製的功能,然後自己去對屬性中的每個物件進行clone操作,就可以基本實現原型模式。

5、 模式的結構

原型模式包含以下主要角色。

抽象原型類:規定了具體原型物件必須實現的介面。

具體原型類:實現抽象原型類的 clone() 方法,它是可被複製的物件。

訪問類:使用具體原型類中的 clone() 方法來複製新的物件。

接下來我們來看看**:

抽象原型類:

public abstract class shape implements cloneable

public void setname(string name)

public abstract void draw();

@override

protected object clone() catch (clonenotsupportedexception e)

return o;

}}

具體原型類:

public class line extends shape 

public void setid(string id)

public body getbody()

public void setbody(body body)

@override

public line clone()

public line(string id, string name, body body)

@override

public string tostring() ';

}@override

public void draw()

}

原型屬性物件

public class body implements cloneable

public integer getweight()

public void setweight(integer weight)

public integer getheight()

public void setheight(integer height)

@override

public object clone() catch (clonenotsupportedexception e)

return o;

}@override

public string tostring() ';

}}

測試方法

public static void main(string args)
執行結果: 

line1: line, name='張三'}

line2: line, name='張三'}

深複製和淺複製:

淺複製:僅僅轉殖屬性裡面的基本型別的值

深複製:不僅僅轉殖基本型別的值,而且還轉殖屬性裡面的陣列、集合和物件

大家看到這就已經夠了,下面的是自己在寫原型模式思考的乙個問題,最後解決了心中的疑惑,其實也是個小問題,但是總感覺心裡不踏實,就試著去搞清楚裡面的套路。

題外話:cloneable介面的clone方法,可以將父類,子類、子類的子類的屬性都進行clone操作,即使只有父類重寫了clone方法

父類

public class parent implements cloneable

public void setname(string name)

public parent(string name)

@override

protected object clone() catch (clonenotsupportedexception e)

return o;

}}

子類

public class son extends parent

public son(string name, integer age)

public integer getage()

public void setage(integer age)

//是否注釋掉都毫無影響

@override

public object clone()

@override

public string tostring() ';

}}

子類的子類

public class sonson extends son

public sonson(string name, integer age)

public sonson(string name, integer age, integer height)

public static void main(string args)

@override

public string tostring() ' + ", age: " + super.getage();

}}

輸出結果

sonson, age: 25

sonson, age: 25

總結:實現了cloneable介面的父類,那麼他的子類,子類的子類,以及本身都會被轉殖裡面的屬性。

這其實已經是題外話了,只不過是自己突然想到的乙個問題,心存疑問,然後自己去嘗試,探索出來的這麼乙個規律。

建立型模式之原型模式

功能 用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。原型模式其實就是從乙個物件建立另外乙個可定製的物件,而且不需知道任何建立的細節。優點 一般在初始化的資訊不發生變化的情況下,轉殖是最好的辦法,既隱藏了物件建立細節,又提高效能。其等於是不用重新初始化物件,而是動態地獲得物件執行時的狀...

建立型模式 原型模式

使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...

建立型模式 原型模式

原型 prototype 模式主要用於建立物件的轉殖,通常其最簡單的形式就是採用自定 clone 函式並 傳入物件引數以返回此物件的乙個副本,這在 python 實作上可使用內定 copy.cop y 或 copy.deepcopy 函式來達到此目的。當已有乙個物件但對此物件的某些部分會被變更卻又想...