一天一個設計模式(四) - 原型模式(Prototype)
阿新 • • 發佈:2018-09-24
管理員 ans rip prototype register 性能 除了 func comm
前言
原型模式屬於對象的創建模式。通過給出一個原型對象來指明所有創建的對象的類型,然後用這個原型對象提供的復制辦法創建出更多同類型的對象。
原型模式的結構
原型模式要求對象實現一個可以克隆自身的接口(類型)。這樣一來,通過原型實例創建新的對象,就不需要關心這個實例本身的類型,只需要實現克隆自身的方法,也而無需再去通過new
來創建。
原型類型的表現形式
- 簡單形式
- 登記形式
正文
簡單形式
相關角色
- 客戶(Client)角色:客戶類提出創建對象的請求;
- 抽象原型(Prototype)角色:這是一個抽象角色,通常由一個
Java
接口或者Java
抽象類實現。此角色定義了的具體原型類所需的實現的方法。 - 具體原型(Concrete Prototype)角色:此角色需要實現抽象原型角色要求的克隆相關的接口。
示例代碼
Prototype.java
1
|
/**
|
ConcretePrototype1.java
1
|
public class ConcretePrototype1 extends Prototype {
|
ConcretePrototype2.java
1
|
public class ConcretePrototype2 extends Prototype {
|
運行結果
登記形式
相關角色
- 客戶(Client)角色:客戶類提出創建對象的請求;
- 抽象原型(Prototype)角色:這是一個抽象角色,通常由一個
Java
接口或者Java
抽象類實現。此角色定義了的具體原型類所需的實現的方法。 - 具體原型(Concrete Prototype)角色:此角色需要實現抽象原型角色要求的克隆相關的接口。
- 原型管理器(Prototype Manager)角色:提供各種原型對象的創建和管理。
示例代碼
除了原型管理器Prototype Manager
以外,登記模式和簡單模式並無其他差異。
Prototype.java
W
1
|
public interface Prototype {
|
ConcretePrototype1.java
1
|
public class ConcretePrototype1 implements Prototype {
|
ConcretePrototype2.java
1
|
public class ConcretePrototype2 implements Prototype {
|
PrototypeManager.java
1
|
public class PrototypeManager {
|
Client.java
1
|
public class Client {
|
運行結果
兩者之間的比較
簡單形式和登記形式的原型模式各有其長處和短處。
- 如果要創建的原型對象數據較少而且比較固定的話,可以采用第一種形式。在這種情況下,原型對象的引用可以由客戶端自己保存。
- 如果要創建的原型對象數據不固定的話,可以采用第二種形式。在這種情況下,客戶端不保存對原型對象的引用,這個任務被交給原型管理器角色。在克隆一個對象之前,客戶端可以查看管理員對象是否已經有一個滿足要求的原型對象。如果有,可以從原型管理器角色中取得這個對象引用;如果沒有,客戶端就需要自行復制此原型對象。
總結
原型模式的優點
原型模式允許在運行時動態改變具體的實現類型。原型模式可以在運行期間,有客戶來註冊符合原型接口的實現類型,也可以動態的改變具體的實現類型,看起來接口沒有任何變化,但是其實運行的已經是另外一個類實體了。因為克隆一個原型對象就類似於實例化一個類。
原型模式的缺點
原型模式最主要的缺點是每一個類都必須要配備一個克隆方法。配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類來說並不是很難,但是對於已有的類來說並不容易。
歡迎關註技術公眾號: 零壹技術棧
本帳號將持續分享後端技術幹貨,包括虛擬機基礎,多線程編程,高性能框架,異步、緩存和消息中間件,分布式和微服務,架構學習和進階等學習資料和文章。
一天一個設計模式(四) - 原型模式(Prototype)