定义:(Prototype Pattern)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
类图:
启示:
邮件外发模块的开发:比如某银行有个理财活动想通过邮件的形式群发给客户推广。
通过分析,我们知道邮件的内容部分即活动内容是固定的,发件人都是银行,不同的是,接收人邮箱及对客户的称呼。如果每次外发邮件都要重新构建一个邮件对象,如果仅仅是几百用户也无可厚非,但对于几百万的客户,这样做肯定是不行的,我们可以通过对象复制的方式来进行对象的创建,再更改不同的部分,以提高性能。
代码:
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("邮件已发送至:『{0}』", email.Receiver));
}
}
应用场景:
一个对象的产生可以不由零起步,直接从一个已经具备一定雏形的对象克隆,然后再修改为生产需要的对象。
优缺点:
优点:
原型模式向客户隐藏了创建新实例的复杂性
缺点:
1、每个类必须配备一个克隆方法
2、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
注意事项:
注意对象的深拷贝与浅拷贝的不同。