原理
原型模式(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;
}
}
}
參考
參考書籍:《大話設計模式》
參考鏈接: 菜鳥教程.