GOF之原型模式

2022-09-15 22:51:16 字數 2372 閱讀 4128

依賴關係的倒置

抽象不應該依賴與實現細節,實現細節應該依賴與抽象。

-抽象a直接依賴與實現細節b                    -抽象a依賴與抽象b,實現細節b依賴與抽象b

動機(motivation)

在軟體系統中,經常面臨著「某些結構複雜的物件」的建立工作;由於需求的變化,這些物件經常面臨著劇烈的變化,但是它們卻擁有比較穩定一致的介面。

如何應對這種變化?如何向「客戶程式(使用這些物件的程式)」隔離出「這些易變物件」,從而使得「依賴這些易變物件的客戶程式」不隨著需求改變而改變?

意圖(intent)

使用原型例項指定建立物件的種類,然後通過拷貝這些原型來建立新的物件。

結構(structure)

**實現:

1

對應於prototype

2public

abstract

class

actor39

set 10}

11public

abstract actor clone(string

name);

12public

abstract

void

say();

13 }

1

對應於concreteprototype

2class

actora:actor311

public

override

void

say()

1215}16

17class

actorb : actor

1826

public

override

void

say()

2730 }

1

對應於client

2class

manager39

set 10}

11public

manager(actor actor)

1215

public

void

operation()

1624 }

1

主函式的呼叫

2static

void main(string

args)

3

由於呼叫object的memberwiseclone()實現的是淺拷貝,所以用序列化實現深拷貝

1

通過序列化實現深拷貝2//

深拷貝3

public

override actor clonedeep(string

name)

416 actor.name =name;

17return

actor;

18 }

prototype模式的幾個要點:prototype模式同樣用於隔離類物件的使用者和具體型別(易變類)之間的耦合關係,它同樣要求這些「易變類」擁有「穩定的介面」。

prototype模式對於「如何建立易變類的實體物件」採用「原型轉殖」的方法來做,它使得我們可以非常靈活的動態建立「擁有某些穩定介面」的新物件--所需工作僅僅是註冊乙個新類的物件(即原型),然後在任何需要的地方不斷的clone。

prototype模式中的clone方法可以利用.net中的object類的memberwiseclone()方法或者序列化來實現深拷貝。

有關建立型模式的討論:

singleton模式解決的是實體物件個數的問題。除了singleton之外,其他建立型模式解決的都是new所帶來的耦合關係。

factory method, abstract factory, builder都需要乙個額外的工廠類來負責例項化「易變物件」,而prototype則是通過原型(乙個特殊的工廠類)來轉殖「易變物件」。

如果遇到「易變類」,起初的設計通常從factory method開始,當遇到更多的複雜變化時,在考慮重構為其他三種工廠模式(abstract factory,builder,singleton)。

GOF建立型模式 原型模式

淺轉殖 import com.sun.jndi.cosnaming.iiopurl class address public class customer implements cloneable public object clone catch exception e return obj 深轉...

GoF23 原型模式

以轉殖羊為例,對比輸出原型和轉殖物件的位址與值的差異 1.新建羊類實現cloneable介面並重寫object中的clone方法,自帶名稱和生日屬性,提供set和get方法。實現轉殖介面並重寫object的clone方法 author wangyds date 2019 5 20 22 10 pub...

GOF23 原型模式

淺拷貝 具體 實現 public class sheep implements cloneable public string getname public void setname string name public intgetage public void setage int age pu...