C#物件導向設計模式學習筆記(5) – Prototype 原型模式(建立型模式)

來源:互聯網
上載者:User

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

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

使用原型執行個體指定建立對象的種類,然後通過拷貝這些原型來建立新的對象。

  

結構:

 

 

public abstract class NormalActor
{
public abstract NormalActor Clone();
}

public abstract class FlyActor
{
public abstract FlyActor Clone();
}

public abstract class WaterActor
{
public abstract WaterActor Clone();
}

 

[Serializable]
public class NormalActorA : NormalActor
{
public override NormalActor Clone()
{
return (NormalActor)this.MemberwiseClone();
}
}

[Serializable]
public class NormalActorB : NormalActor
{
public override NormalActor Clone()
{
return (NormalActor)this.MemberwiseClone();
}
}

[Serializable]
public class FlyActorA : FlyActor
{
public override FlyActor Clone()
{
return (FlyActor)this.MemberwiseClone();
}
}

[Serializable]
public class FlyActorB : FlyActor
{
public override FlyActor Clone()
{
return (FlyActor)this.MemberwiseClone();
}
}

[Serializable]
public class WaterActorA : WaterActor
{
public override WaterActor Clone()
{
return (WaterActor)this.MemberwiseClone();
}
}

[Serializable]
public class WaterActorB : WaterActor
{
public override WaterActor Clone()
{
return (WaterActor)this.MemberwiseClone();
}
}

 

public class GameSystem
{
public NormalActor normalActor;
public FlyActor flyActor;
public WaterActor waterActor;

public void Run()
{
NormalActor normalActor1 = normalActor.Clone();
NormalActor normalActor2 = normalActor.Clone();
NormalActor normalActor3 = normalActor.Clone();
NormalActor normalActor4 = normalActor.Clone();
NormalActor normalActor5 = normalActor.Clone();

FlyActor flyActor1 = flyActor.Clone();
FlyActor flyActor2 = flyActor.Clone();

WaterActor waterActor1 = waterActor.Clone();
WaterActor waterActor2 = waterActor.Clone();
}
}
class App
{
public static void Main()
{
GameSystem gameSystem = new GameSystem();
gameSystem.normalActor = new NormalActorA();
gameSystem.flyActor = new FlyActorB();
gameSystem.waterActor = new WaterActorB();

gameSystem.Run();
}
}

 

要點:

1、Prototype模式同樣用於隔離類對象的使用者和具體類型(易變類)之間的耦合關係,它同樣要求這些“易變類”擁有“穩定的介面”;

2、Prototype模式對於“如何建立易變類的實體物件”採用“原型複製”的方法來做,它使得我們可以非常靈活地動態建立“擁有某些穩定介面”的新對象--所需工作僅僅是註冊一個新類的對象(即原型),然後在任何需要的地方不斷地Clone;

3、Prototype模式中的Clone方法可以利用.NET中的Object類的MemberwiseClone()方法或者序列化來實現深拷貝。

 

有關建立性模式的討論:

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

2、Factory Method、Abstract Factory、Builder都需要一個額外的工廠類來負責執行個體化“易變對象”,而Prototype則是通過原型(一個特殊的工廠類)來複製“易變對象”;

3、如果遇到“易變類”,起初的設計通常從Factory Method開始,當遇到更多的複雜變化時,再考慮重構為其他三種原廠模式(Abstract Factory、Builder、Prototype)

 

依賴倒置原則:

抽象不應該依賴於實現細節b 抽象A應該依賴於抽象B,實現細節b依賴於抽象B
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.