zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

重复构造,打出『原型模式』

2023-02-18 16:47:11 时间

定义:(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、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

注意事项:

注意对象的深拷贝与浅拷贝的不同。

源码:

源代码C#

系列导航:

目录