定義:(Prototype Pattern)
用原型實例指定創(chuàng)建對象的種類哪轿,并且通過拷貝這些原型創(chuàng)建新的對象蔚袍。
類圖:
啟示:
郵件外發(fā)模塊的開發(fā):比如某銀行有個理財活動想通過郵件的形式群發(fā)給客戶推廣侧蘸。
通過分析撤嫩,我們知道郵件的內(nèi)容部分即活動內(nèi)容是固定的偎捎,發(fā)件人都是銀行,不同的是序攘,接收人郵箱及對客戶的稱呼茴她。如果每次外發(fā)郵件都要重新構(gòu)建一個郵件對象,如果僅僅是幾百用戶也無可厚非两踏,但對于幾百萬的客戶败京,這樣做肯定是不行的,我們可以通過對象復(fù)制的方式來進行對象的創(chuàng)建梦染,再更改不同的部分赡麦,以提高性能。
代碼:
public class Email : ICloneable
{
public string Receiver { get; set; }
public string Sender { get; set; }
public string Subject { get; set; }
public string Name { get; set; }
public string Content { get; set; }
public string Footer { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("原型模式:");
Email email = new Email()
{
Sender = "noreply@cmb.com",
Subject = "招商銀行月開鑫基金上線啦帕识,最低年化收益7%泛粹,速速搶購!",
Content = "招商銀行月開鑫基金上線啦肮疗,最低年化收益7%晶姊,速速搶購,手慢無伪货,每人限購1萬们衙,詳情咨詢95555!",
Footer = "招商銀行"
};
for (int i = 0; i < 10000; i++)
{
string receiver = string.Format("kehu{0}@qq.com", i);
string name = string.Format("尊敬的客戶『{0}』:", i);
var cloneEmail = email.Clone() as Email;
cloneEmail.Receiver = receiver;
cloneEmail.Name = name;
SendEmail(cloneEmail);
}
}
private static void SendEmail(Email email)
{
Console.WriteLine(string.Format("郵件已發(fā)送至:『{0}』", email.Receiver));
}
}
應(yīng)用場景:
一個對象的產(chǎn)生可以不由零起步碱呼,直接從一個已經(jīng)具備一定雛形的對象克隆蒙挑,然后再修改為生產(chǎn)需要的對象。
優(yōu)缺點:
優(yōu)點:
原型模式向客戶隱藏了創(chuàng)建新實例的復(fù)雜性
缺點:
1愚臀、每個類必須配備一個克隆方法
2忆蚀、配備克隆方法需要對類的功能進行通盤考慮,這對于全新的類不是很難姑裂,但對于已有的類不一定很容易馋袜,特別當一個類引用不支持串行化的間接對象,或者引用含有循環(huán)結(jié)構(gòu)的時候舶斧。
注意事項:
注意對象的深拷貝與淺拷貝的不同欣鳖。