8.原型模式

原理

原型模式(Prototype Pattern)是用於創建重複的對象,同時又能保證性能。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
這種模式是實現了一個原型接口,該接口用於創建當前對象的克隆。當直接創建對象的代價比較大時,則採用這種模式。例如,一個對象需要在一個高代價的數據庫操作之後被創建。我們可以緩存該對象,在下一個請求時返回它的克隆,在需要的時候更新數據庫,以此來減少數據庫調用。

意圖

用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。

主要解決

在運行期建立和刪除原型。

應用實例:

細胞分裂。

代碼

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 原型模式
{
    class Program
    {
        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-2003","yy企業");

            Resume c = (Resume)a.Clone();
            c.SetPersonalInfo("男", "24");

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

            Console.ReadKey();

        }
    }
}

Resume.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//淺複製:如果字段是值類型,則對該字段執行逐位複製
//深複製:如果字段是引用類型,則複製引用但不復制引用的對象;因此,原始對象集其複本引用同一對象
namespace 原型模式
{
    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();
        }

    }

    //.Net提供了ICloneable接口,其中唯一的方法就是Clone(), 這樣只要實現這個接口就可以完成原型模式
    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;
        }
        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("工作經歷:{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;
        }
    }
}

參考

參考書籍:《大話設計模式》
參考鏈接: 菜鳥教程.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章