6壤圃,原型模式(Prototype)

1,定義

原型模式:用原型實例指定創(chuàng)建對象的種類琅轧,并且通過拷貝這些原型創(chuàng)建新對象

2伍绳,基本代碼

 abstract class Prototype
    {
        private string id;

        // Constructor 
        public Prototype(string id)
        {
            this.id = id;
        }

        // Property 
        public string Id
        {
            get { return id; }
        }

        public abstract Prototype Clone();
    }

    class ConcretePrototype1 : Prototype
    {
        // Constructor 
        public ConcretePrototype1(string id)
            : base(id)
        {
        }

        public override Prototype Clone()
        {
            // Shallow copy 
            return (Prototype)this.MemberwiseClone();
        }
    }


    class ConcretePrototype2 : Prototype
    {
        // Constructor 
        public ConcretePrototype2(string id)
            : base(id)
        {
        }

        public override Prototype Clone()
        {
            // Shallow copy 
            return (Prototype)this.MemberwiseClone();
        }
    }

// 調(diào)用
        static void Main(string[] args)
        {
            ConcretePrototype1 p1 = new ConcretePrototype1("I");
            ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
            Console.WriteLine("Cloned: {0}", c1.Id);

            ConcretePrototype2 p2 = new ConcretePrototype2("II");
            ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();
            Console.WriteLine("Cloned: {0}", c2.Id);

            // Wait for user 
            Console.Read();

        }

3,簡單實現(xiàn)

 //簡歷
    class Resume : ICloneable
    {
        private string name;
        private string sex;
        private string age;

        private WorkExperience work;

        public Resume(string name)
        {
            this.name = name;
            work = new WorkExperience();
        }

        private Resume(WorkExperience work)
        {
            this.work = (WorkExperience)work.Clone();
        }

        //設置個人信息
        public void SetPersonalInfo(string sex, string age)
        {
            this.sex = sex;
            this.age = age;
        }
        //設置工作經(jīng)歷
        public void SetWorkExperience(string workDate, string company)
        {
            work.WorkDate = workDate;
            work.Company = company;
        }

        //顯示
        public void Display()
        {
            Console.WriteLine("{0} {1} {2}", name, sex, age);
            Console.WriteLine("工作經(jīng)歷:{0} {1}", work.WorkDate, work.Company);
        }

        public Object Clone()
        {
            Resume obj = new Resume(this.work);

            obj.name = this.name;
            obj.sex = this.sex;
            obj.age = this.age;


            return obj;
        }

    }

    //工作經(jīng)歷
    class WorkExperience : ICloneable
    {
        private string workDate;
        public string WorkDate
        {
            get { return workDate; }
            set { workDate = value; }
        }
        private string company;
        public string Company
        {
            get { return company; }
            set { company = value; }
        }

        public Object Clone()
        {
            return (Object)this.MemberwiseClone();
        }
    }

          // 調(diào)用
         static void Main(string[] args)
        {
            Resume a = new Resume("大鳥");
            a.SetPersonalInfo("男", "29");
            a.SetWorkExperience("1998-2000", "XX公司");

            Resume b = (Resume)a.Clone();
            b.SetWorkExperience("1998-2006", "YY企業(yè)");

            Resume c = (Resume)a.Clone();
            c.SetWorkExperience("1998-2003", "ZZ企業(yè)");

            a.Display();
            b.Display();
            c.Display();

            Console.Read();

        }

4乍桂,關(guān)于原型模式的思考

1冲杀,深復制,淺復制
淺復制:被復制對象的所有的變量都含有與原來的對象相同的值睹酌,而所有的對其他對象的引用都指向原來的對象
深復制:把引用對象的變量指向復制過的新對象权谁,而不是原有的被引用的對象
2,System的ICloneable()接口
MemberwiseClone() 方法:如果字段是值類型的憋沿,則對該字段進行逐位復制旺芽,如果字段是引用類型,則復制引用但是不復制引用對象辐啄,因此采章,原有對象及其復本引用同一對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壶辜,隨后出現(xiàn)的幾起案子悯舟,更是在濱河造成了極大的恐慌,老刑警劉巖砸民,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抵怎,死亡現(xiàn)場離奇詭異奋救,居然都是意外死亡,警方通過查閱死者的電腦和手機反惕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門尝艘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人承璃,你說我怎么就攤上這事利耍。” “怎么了盔粹?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵隘梨,是天一觀的道長。 經(jīng)常有香客問我舷嗡,道長轴猎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任进萄,我火速辦了婚禮捻脖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘中鼠。我一直安慰自己可婶,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布援雇。 她就那樣靜靜地躺著矛渴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惫搏。 梳的紋絲不亂的頭發(fā)上具温,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音筐赔,去河邊找鬼铣猩。 笑死,一個胖子當著我的面吹牛茴丰,可吹牛的內(nèi)容都是我干的达皿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼较沪,長吁一口氣:“原來是場噩夢啊……” “哼鳞绕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尸曼,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤们何,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后控轿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冤竹,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡拂封,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹦蠕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冒签。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钟病,靈堂內(nèi)的尸體忽然破棺而出萧恕,到底是詐尸還是另有隱情,我是刑警寧澤肠阱,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布票唆,位于F島的核電站,受9級特大地震影響屹徘,放射性物質(zhì)發(fā)生泄漏走趋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一噪伊、第九天 我趴在偏房一處隱蔽的房頂上張望簿煌。 院中可真熱鬧,春花似錦鉴吹、人聲如沸姨伟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽授滓。三九已至,卻和暖如春肆糕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背在孝。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工诚啃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人私沮。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓始赎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仔燕。 傳聞我的和親對象是個殘疾皇子造垛,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容