依賴關係的倒置
抽象不應該依賴與實現細節,實現細節應該依賴與抽象。
-抽象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由於呼叫object的memberwiseclone()實現的是淺拷貝,所以用序列化實現深拷貝主函式的呼叫
2static
void main(string
args)
3
1prototype模式的幾個要點:prototype模式同樣用於隔離類物件的使用者和具體型別(易變類)之間的耦合關係,它同樣要求這些「易變類」擁有「穩定的介面」。通過序列化實現深拷貝2//
深拷貝3
public
override actor clonedeep(string
name)
416 actor.name =name;
17return
actor;
18 }
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...