久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

創(chuàng)建型模式之原型模式

 行者花雕 2021-07-13

定義與特點(diǎn)

原型(Prototype)模式的定義如下:用一個(gè)已經(jīng)創(chuàng)建的實(shí)例作為原型,通過復(fù)制該原型對(duì)象來創(chuàng)建一個(gè)和原型相同或相似的新對(duì)象。
在這里,,原型實(shí)例指定了要?jiǎng)?chuàng)建的對(duì)象的種類。用這種方式創(chuàng)建對(duì)象非常高效,,根本無須知道對(duì)象創(chuàng)建的細(xì)節(jié)。
例如,Windows 操作系統(tǒng)的安裝通常較耗時(shí),如果復(fù)制就快了很多,。在生活中復(fù)制的例子非常多,這里不一一列舉了,。

結(jié)構(gòu)與實(shí)現(xiàn)

由于 C# 提供了 ICloneable 接口,,用 C# 實(shí)現(xiàn)原型模式很簡單。

模式的結(jié)構(gòu)

原型模式包含以下主要角色:

  • 原型(Prototype):聲明一個(gè)克隆自身的接口,,該角色一般有抽象類(Prototype),、接口(ICloneable)兩種實(shí)現(xiàn)方式(GOF使用的是抽象類,,在C#中個(gè)人推薦使用接口),。

  • 具體原型類(ConcretePrototype):實(shí)現(xiàn)原型(抽象類或接口)的 Clone() 方法,它是可被復(fù)制的對(duì)象,。

  • 訪問類(Client):使用具體原型類中的 Clone() 方法來復(fù)制新的對(duì)象,。

使用接口作為Prototype時(shí),其結(jié)構(gòu)圖如圖所示(后面全部是接口方式的原型模式實(shí)現(xiàn)):

使用抽象類作為Prototype時(shí),,其結(jié)構(gòu)圖如圖所示(來自GOF):

模式的實(shí)現(xiàn)

C# 中已經(jīng)定義了 ICloneable 接口,,具體原型類只要實(shí)現(xiàn) ICloneable 接口就可實(shí)現(xiàn)對(duì)象的克?。∣bject有 MemberwiseClone() 方法默認(rèn)淺克隆),,克隆是淺克隆還是深克隆取決于具體原型類 Clone() 的實(shí)現(xiàn),。其代碼如下:

//原型接口:該接口不需要自己定義,C#中已經(jīng)定義好了
public interface ICloneable
{    
    Object Clone();
}

//抽象原型類
public abstract class Prototype
{
    public abstract Object Clone();
}

//具體原型類(接口方式)
public class ConcretePrototype : /*Prototype,*/ICloneable
{
    private int id;
    public int Id
    {
        get { return id; }
    }
    public ConcretePrototype(int id) 
    {
        this.id = id;
    }
    public Object Clone() 
    {
        return new ConcretePrototype(id);
    }

    //使用抽象原型類
    //public override Object Clone()
    //{
    //    //Object的默認(rèn)克隆方式(淺克?。?    //    return (Prototype)this.MemberwiseClone();
    //}
}

//訪問類,,這里直接用的控制臺(tái)的Program類
class Program
{
    static void Main(string[] args)
    {
        ConcretePrototype cp1 = new ConcretePrototype(1);
        ConcretePrototype cp2 = (ConcretePrototype)cp1.Clone();
        Console.WriteLine("cp1的Id為:{0}",cp1.Id);
        Console.WriteLine("cp2的Id為:{0}", cp2.Id);
        Console.ReadKey();
    }
}

運(yùn)行結(jié)果:

cp1的Id為:1
cp2的Id為:1

應(yīng)用場景

原型模式通常適用于以下場景:

  • 對(duì)象之間相同或相似,即只是個(gè)別的幾個(gè)屬性不同的時(shí)候,。

  • 對(duì)象的創(chuàng)建過程比較麻煩,,但復(fù)制比較簡單的時(shí)候。

擴(kuò)展:帶原型管理器的原型模式

原型模式可擴(kuò)展為帶原型管理器的原型模式,,它在原型模式的基礎(chǔ)上增加了一個(gè)原型管理器 PrototypeManager 類,。該類用 Dictionary(或HashMap) 保存多個(gè)復(fù)制的原型,Client 類可以通過管理器的 Get(String id) 方法從中獲取復(fù)制的原型,。其結(jié)構(gòu)如圖所示:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多