在軟件系統中,當創建一個類的實例的過程很昂貴或很復雜,並且我們需要創建多個這樣類的實例時,如果我們用new操作符去創建這樣的類實例,這未免會增加創建類的復雜度和耗費更多的內存空間,因為這樣在內存中分配了多個一樣的類實例對象,然後如果采用工廠模式來創建這樣的系統的話,隨著產品類的不斷增加,導致子類的數量不斷增多,反而增加了系統復雜程度,所以在這裡使用工廠模式來封裝類創建過程並不合適,然而原型模式可以很好地解決這個問題,因為每個類實例都是相同的,當我們需要多個相同的類實例時,沒必要每次都使用new運算符去創建相同的類實例對象,此時我們一般思路就是想——只創建一個類實例對象,如果後面需要更多這樣的實例,可以通過對原來對象拷貝一份來完成創建,這樣在內存中不需要創建多個相同的類實例,從而減少內存的消耗和達到類實例的復用。 然而這個思路正是原型模式的實現方式。下面就具體介紹下設計模式中的原型設計模式。
在現實生活中,也有很多原型設計模式的例子,。具體的實現代碼如下:
Main( MonkeyKingPrototype prototypeMonkeyKing = ConcretePrototype( MonkeyKingPrototype cloneMonkeyKing = prototypeMonkeyKing.Clone() + MonkeyKingPrototype cloneMonkeyKing2 = prototypeMonkeyKing.Clone() + Id { ; MonkeyKingPrototype(.Id = ConcretePrototype( (MonkeyKingPrototype)
上面原型模式的運行結果為(從運行結果可以看出,創建的兩個拷貝對象的ID屬性都是與原型對象ID屬性一樣的):
上面代碼實現的淺拷貝的方式,
介紹完原型模式的實現代碼之後,下面看下原型模式的類圖,通過類圖來理清原型模式實現中類之間的關系。具體類圖如下:
原型模式的優點有:
原型模式的缺點有:
在.NET中可以很容易地通過實現ICloneable接口()中Clone()方法來實現原型模式,如果我們想我們自定義的類具有克隆的功能,首先定義類繼承與ICloneable接口並實現Clone方法。在.NET中實現了原型模式的類如下圖所示(圖中只截取了部分,可以用Reflector反編譯工具進行查看):
到這裡關於原型模式的介紹就結束了,原型模式用一個原型對象來指明所要創建的對象類型,然後用復制這個原型對象的方法來創建出更多的同類型對象,。
本專題中所有源碼:設計模式之原型模式