設計模式詳解 原型模式

2021-09-14 08:11:30 字數 2851 閱讀 6517

是指原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。而呼叫者不需要知道任何建立細節,不呼叫建構函式

其實就是如何快速構建物件的方法總結,比如簡單工廠將getter setter封裝到某個方法中

jdk提供實現cloneable介面,實現快速複製。當初在spring配置scope="prototype",、scope="singotn"就是在設定是否原型模式建立物件

屬於建立型模式

適用場景:

1)類初始化消耗資源較多

2)new產生的乙個物件需要非常繁瑣的過程(資料準備,訪問許可權等)

3)建構函式比較複雜

4)迴圈體中生產大量物件時

轉殖分為深轉殖和淺轉殖

⑴淺複製(淺轉殖) 

被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺複製僅僅複製所考慮的物件,而不複製它所引用的物件。 object類提供的方法clone只是拷貝本物件,就是在實體類中實現cloneable介面然後重寫clone()方法即可,其物件內部的陣列、引用物件等都不拷貝,還是指向原生物件的內部元素位址

我們這裡手寫乙個介面模擬jdk原生的拷貝

先寫乙個代替clonable的介面prototype

1.

public inte***ce prototype
2.然後再寫乙個實體類來實現這個介面並重寫clone方法

public class concreteprototypea implements prototype 

public void setage(int age)

public string getname()

public void setname(string name)

public list gethobbies()

public void sethobbies(list hobbies)

@override

public concreteprototypea clone()

}

可以看到我們這裡clone方法就是new乙個物件然後把已有的值賦給它。

3.寫乙個客戶端來**原型模式(也可以不寫直接在測試類中呼叫)

public class client 

public prototype startclone(prototype concreteprototype)

}

4.寫乙個測試類看看兩個物件中的某個元素的位址是否一致

public class prototypetest 

}

6.輸出結果截圖

可以看到name的屬性複製是淺轉殖,位址是一致的

⑵深複製(深轉殖) 

被複製物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數。那些引用其他物件的變數將指向被複製過的新物件,而不再是原有的那些被引用的物件。換言之,深複製把要複製的物件所引用的物件都複製了一遍。 

我們以孫悟空拔下三根救命毫毛可以變出多個猴子猴孫為例

1.首先寫乙個猴子的實體父類

public class monkey
2.然後再寫乙個金箍棒的實體,因為千變萬化的孫猴子不可能用乙個金箍棒吧,所以這裡要實現深轉殖,實現serializable介面

public class jingubang implements serializable 

public void small()

}

3.寫乙個齊天大聖的實體

public class qitiandasheng extends monkey implements cloneable,serializable 

@override

protected object clone() throws clonenotsupportedexception

public object deepclone()catch (exception e)

}public qitiandasheng shallowclone(qitiandasheng target)

}

這個類要同時實現clonable和serializable介面,我在這個類中寫了兩個方法乙個是深轉殖乙個是淺轉殖。

4.編寫測試類

public class deepclonetest  catch (exception e) 

qitiandasheng q = new qitiandasheng();

qitiandasheng n = q.shallowclone(q);

system.out.println("淺轉殖:" + (q.jingubang == n.jingubang));}}

5.執行結果

可以發現深轉殖的結果是產生了不同的物件,深轉殖成功

(3)總結

深轉殖可能會產生單例被破壞的情況,與單例唱反調。所以如果不想讓單例被破壞可以不實現cloneable

缺點:必須配備轉殖(或者可拷貝)方法

對轉殖複雜物件或對轉殖出的物件進行複雜改造時,容易帶來風險

深拷貝、淺拷貝要運用得當

設計模式詳解 原型模式

原型模式 prototype pattern 是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式是實現了乙個原型介面,該介面用於建立當前物件的轉殖。當直接建立物件的代價比較大時,則採用這種模式。例如,乙個物件需要在乙個高代價的資料庫操作...

設計模式 原型模式

1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...

設計模式 原型模式

魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...