通俗易懂設計模式解析——原型模式


前言

  前面幾章我們介紹了創建型設計模式的部分內容,今天我要說的是創建型設計模式中最后一個——原型模式,原型模式是創建型模式中的一種較為特殊的模式,有個最大的特點是克隆一個現有的對象,在我們日常軟件系統開發中,某些對象的創建new即為復雜,而且我們需要使用多個相同的實例,這樣如果我們依舊使用new去進行創建。就會增加系統的復雜度和增加代碼之間的耦合度。但是我們使用前面介紹的工廠模式的話,隨着產品類型的增多,子類也會隨之增多。維護代碼的難度也就會越來越大,所以這里暫時不適合使用工廠模式。由於實例都是一樣的,類型相同。但是實例的參數和狀態可能不同。這里有一個對象,然后再結合我們今天要講述的原型模式。可以通過一個原型對象,克隆拷貝出許多其他相同的對象來。

原型模式介紹

一、來由

  在面對軟件系統設計的過程中,會面臨着”復雜對象”的創建,然而對象可能會由於需求的變動而進行變動。那么我們又需要保持接口的穩定性。這時如何保證應對這種變化呢?

  創建型模式一般是用來創建一個新的對象,然后我們使用這個對象完成一些對象的操作,我們通過原型模式可以快速的創建一個對象而不需要提供專門的new()操作就可以快速完成對象的創建,這無疑是一種非常有效的方式,快速的創建一個新的對象。

二、意圖

    使用原型實例指定創建對象的種類,然后通過拷貝這些原型來創建新的對象。

三、案例圖

 

 

 

四、原型模式代碼示例

  在原型模式中包含的組成部分較少:

    抽象原型類:原型類,聲明一需要實現的接口及clone自身的方法

    具體原型類:實現其余接口及clone自身的方法

 

  我們來看這么一個示例,我記得小時候上課的時候有時候就想着出去玩,就望着窗戶發呆。又出不去。就想自己可以分身就好了。就可以一個留在教室學習,一個出去玩耍,學習可以一次性學習多門功課,玩耍可以一次玩多個游戲。這樣就什么都沒有耽誤,多好呀。當然也只是想想,實現這個暫時是不可能的了。雖然說現實中沒辦法實現了。剛好今天講原型模式,就借用這個示例來講解原型模式到底是如何使用的吧:

 

namespace Prototype_Pattern
{
    class PrototypePattern
    {
    }
    #region 抽象原型類===========
    public abstract class Prototype 
    {
        /// <summary>
        /// 當前自己的狀態
        /// </summary>
        public abstract void Status();
        /// <summary>
        /// 當前自己在做的事情
        /// </summary>
        public abstract void Action(string things);
        /// <summary>
        /// 拷貝自身的方法
        /// </summary>
        /// <returns></returns>
        public abstract Prototype Clone();
    }
    #endregion

    #region  具體原型類——讀書學習 =============
    public class LearnPrototype : Prototype
    {
        public override void Status()
        {
           Console.WriteLine("當前狀態:好好學習"); 
        }

        public override void Action(string things)
        {
            Console.WriteLine(things);
        }

        public override Prototype Clone()
        {
            return (LearnPrototype)this.MemberwiseClone(); 
        } 
       
    }
    #endregion

    #region  具體原型類——外出玩耍 =============
    public class PlayPrototype : Prototype
    { 
        public override void Status()
        {
            Console.WriteLine("當前狀態:開心玩耍");
        }

        public override void Action(string things)
        {
            Console.WriteLine( things);
        }

        public override Prototype Clone()
        {
            return (PlayPrototype)this.MemberwiseClone();
        }
    }
    #endregion
}

 

   class Program
    {
        static void Main(string[] args)
        {
            //學習
            Prototype learnPrototype = new LearnPrototype();
            learnPrototype.Status();
            learnPrototype.Action("一號在學習:語文");

            Prototype learnPrototype1 = learnPrototype.Clone();
            learnPrototype.Status();
            learnPrototype.Action("二號在學習:數學");

            //玩耍
            Prototype playPrototype = new PlayPrototype();
            playPrototype.Status();
            playPrototype.Action("一號在玩耍:游戲王");

            Prototype playPrototype1 = playPrototype.Clone();
            learnPrototype.Status();
            learnPrototype.Action("二號在玩耍:四驅賽車");

        }
    }

 

使用場景及優缺點

一、使用場景

1、在處於資源優化的時候,減少new類的初始化的數量以減少資源消耗

2、一個對象多個利用修改,將一個對象提供給多個調用者使用。

二、優點

1、原型模式向客戶端隱藏了創建對象的復雜性,提供Clone進行淺拷貝

2、原型類允許動態的增加或減少產品類

3、產品類不需要先確定產品的等級結構,原型模式適用於任何等級結構

三、缺點

1、每一個類都需要配備一個克隆方法

2、配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。

總結

  到這里創建型的五個設計模式我們就暫時的介紹完畢了。 在學習設計模式的時候需要多思考,多斟酌。最好在重構之時考慮加入設計模式。保證設計模式發揮最大的用處。到這里創建型模式講完了。單例模式關注的是對象實例個數的問題。控制對象僅有一個實例,全局訪問調用。工廠模式和抽象工廠模式解決的是”單個對象”及”一系列對象”的問題。而建造者模式關注解決的是”對象部分”的問題。今天講的原型模式可以算的上一個特殊的工廠模式。原型模式一般極少單獨使用,一般是配合工廠模式一起使用的。接下來的時間中給大家帶來的是結構型的設計模式解析

平凡人生要用平凡的心去對待,你的人生將會更精彩。

    C#設計模式系列目錄

歡迎大家掃描下方二維碼,和我一起踏上設計模式的闖關之路吧!

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM