原型模式

  我们日常工作中,部门领导需要了解项目进度,存在的问题,就会开个部门例会,此时需要邮件群发到部门各个员工:
邮件模板类:

public class MailTemplate
{
    //邮件主题
    private String mailSubject = "请软件部来301室开会";
    //邮件内容
    private String mailContext = "梳理一下项目上存在的问题";

    public String getMailSubject()
    {
        return mailSubject;
    }
    public void setMailSubject(String mailSubject)
    {
        this.mailSubject = mailSubject;
    }
    public String getMailContext()
    {
        return mailContext;
    }
    public void setMailContext(String mailContext)
    {
        this.mailContext = mailContext;
    }

}

邮件类:

public class Mail
{
    //收件人
    private String receiver;
    //邮件名称
    private String subject;
    //称谓
    private String appellation;
    //邮件内容
    private String context;

    public Mail( MailTemplate mailTemplate)
    {
        this.context = mailTemplate.getMailContext();
        this.subject = mailTemplate.getMailSubject();
    }

    public String getReceiver()
    {
        return receiver;
    }

    public void setReceiver(String receiver)
    {
        this.receiver = receiver;
    }

    public String getSubject()
    {
        return subject;
    }

    public void setSubject(String subject)
    {
        this.subject = subject;
    }

    public String getAppellation()
    {
        return appellation;
    }

    public void setAppellation(String appellation)
    {
        this.appellation = appellation;
    }

    public String getContext()
    {
        return context;
    }

    public void setContext(String context)
    {
        this.context = context;
    }


}

部门老大:

public class Client
{
        public static void main(String[] args)
        {
            int i=0;
            Mail mail = new Mail(new MailTemplate());
            while(i<6)
            {
                mail.setAppellation((getRandString(2)+"工程师"));
                mail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
                sendMail(mail);
                i++;
            }
        }

        private static void sendMail(Mail mail)
        {
            // TODO Auto-generated method stub
            System.out.println("标题:"+"请"+mail.getAppellation()+mail.getSubject() + "\t收件人:"+mail.getReceiver()+"\t内容:"+mail.getContext()+"\t...发送成功");
        }


        private static String getRandString(int max)
        {
            String source = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
            StringBuffer buffer  = new StringBuffer();
            Random random = new Random();
            for(int i =0;i<max;i++)
            {
                buffer.append(source.charAt(random.nextInt(source.length())));
            }
            return buffer.toString();
        }
}

发送结果:

标题:请Fo工程师来301室开会    收件人:eJUTM@ffmFmySs.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请pp工程师来301室开会    收件人:yGHDa@tWZeJGDK.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请Eu工程师来301室开会    收件人:rgrmn@ppPXgHeF.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请BC工程师来301室开会    收件人:SJSOK@JmOnrsCz.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请jk工程师来301室开会    收件人:XPvpv@yXsYNWbh.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请GF工程师来301室开会    收件人:LQhgX@ZogoOKEl.com  内容:梳理一下项目上存在的问题 ...发送成功

  整个开会的邮件全部发出,现在设想一下,如果一封邮件要发出去需要0.1s,那么有600万用户需要发送那么可以想一下这些邮件一天都发不完,如果我们采用多线程发送又存在线程不安全问题,我们这里使用原型模式通过对象复制来完成这个需求。

我们让Mail类实现Cloneable接口:

public class Mail implements Cloneable
{
    //收件人
    private String receiver;
    //邮件名称
    private String subject;
    //称谓
    private String appellation;
    //邮件内容
    private String context;

    public Mail( MailTemplate mailTemplate)
    {
        this.context = mailTemplate.getMailContext();
        this.subject = mailTemplate.getMailSubject();
    }

    public String getReceiver()
    {
        return receiver;
    }

    public void setReceiver(String receiver)
    {
        this.receiver = receiver;
    }

    public String getSubject()
    {
        return subject;
    }

    public void setSubject(String subject)
    {
        this.subject = subject;
    }

    public String getAppellation()
    {
        return appellation;
    }

    public void setAppellation(String appellation)
    {
        this.appellation = appellation;
    }

    public String getContext()
    {
        return context;
    }

    public void setContext(String context)
    {
        this.context = context;
    }

    @Override
    protected Object clone() 
    {
        Mail mail = null;
        try {
            mail = (Mail) super.clone();
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return mail;
    }
}

部门领导:

public class Client
{
        public static void main(String[] args)
        {
            int i=0;
            Mail mail = new Mail(new MailTemplate());
            while(i<6)
            {
                Mail cloneMail = (Mail) mail.clone();
                cloneMail.setAppellation((getRandString(2)+"工程师"));
                cloneMail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
                sendMail(cloneMail);
                i++;
            }
        }

        private static void sendMail(Mail mail)
        {
            // TODO Auto-generated method stub
            System.out.println("标题:"+"请"+mail.getAppellation()+mail.getSubject() + "\t收件人:"+mail.getReceiver()+"\t内容:"+mail.getContext()+"\t...发送成功");
        }

        private static String getRandString(int max)
        {
            String source = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
            StringBuffer buffer  = new StringBuffer();
            Random random = new Random();
            for(int i =0;i<max;i++)
            {
                buffer.append(source.charAt(random.nextInt(source.length())));
            }
            return buffer.toString();
        }
}

执行结果:

标题:请Gg工程师来301室开会    收件人:XdNmL@MbqzXPHh.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请cV工程师来301室开会    收件人:vIZHG@NuHeFjqK.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请tA工程师来301室开会    收件人:wZbum@izTjuoAy.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请Wb工程师来301室开会    收件人:kbuoI@hnObuRnQ.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请kC工程师来301室开会    收件人:RZuYZ@DuOfRoVL.com  内容:梳理一下项目上存在的问题 ...发送成功
标题:请WT工程师来301室开会    收件人:FwlxK@xSMMQred.com  内容:梳理一下项目上存在的问题 ...发送成功

  一样完成了邮件的发送,而且与多线程没有关系,我们通过对象的复制来完成快速发送邮件的方式叫做原型模式。
  
原型模式定义
  原型模式:Specify the kind of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)
原型模式的核心就是一个clone方法,通过该方法进行对象的拷贝。

原型模式的优点:
  性能优良:存在二进制流的拷贝,比new一个对象性能好很多。
  逃避构造函数的约束:这个既是优点也是缺点,直接在内存中拷贝,不会执行构造方法。

原型模式使用时注意的事项:
  1.构造函数不会被执行,我们调用clone方法复制对象时,我们的构造方法不会执行。
  2.深复制和浅复制
  浅复制:Object提供的clone方法知识拷贝本对象,其对象内的数组、引用对象等都不拷贝,但是原生数据类型和String类型都会拷贝,还是指向原生对象的内部元素地址。
  深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
  要实现深复制只要在clone方法中添加引用对象的拷贝就可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己整理的163邮箱模板,用了好长时间,给大家分享一下 部分内容如下: <div class="gSidebar theme-sb-top"> <div class="core"><a href="javascript:fGoto();" class="check" hidefocus="true" onClick="fGoto('CC.goOutlink(\'/163/shoujian/index.jsp.htm\');');this.blur()" >收信</a><a href="javascript:fGoto();" class="compose" hidefocus="true" onClick="fGoto('CC.goOutlink(\'/163/xiexin/index.jsp.htm\');');this.blur()">写信</a></div> <div class="cnav gSb-sservice"> <div class="gSb-cnav-tit"><a href="javascript:fGoto();" id="lnkServiceToggle" class="fn-bg opned" title="收起邮箱服务" hidefocus="true" onClick="this.className=(this.className=='fn-bg opned'?'fn-bg clded':'fn-bg opned');$('ulServiceFolders').toggle();"></a> <a href="javascript:fGoto();" class="ct" onClick="$('lnkServiceToggle').onclick()" hidefocus="true">邮箱服务</a></div> <ul id="ulServiceFolders" > <LI id=s163 onMouseOver="this.className='over'" onMouseOut="this.className=''"> <A onfocus=this.blur(); onClick="fGoto('CC.goOutlink(\'/163/shoujian/index.jsp.htm\');');CC.changeServiceTab(this.parentNode);" href="javascript:fGoto();" hidefocus="true" class="ct">收件箱</A></LI> <LI id=cg163 onMouseOver="this.className='over'" onMouseOut="this.className=''"> <A onfocus=this.blur(); onClick= "fGoto('CC.goOutlink(\'/163/caogao/index.jsp.htm\');');CC.changeServiceTab(this.parentNode);" href="javascript:fGoto();" hidefocus="true" class="ct">草稿箱</A></LI> <LI id=fj163 onMouseOver="this.className='over'" onMouseOut="this.className=''"> <A onfocus=this.blur(); onClick="fGoto('CC.goOutlink(\'/163/fajian/index.jsp.htm\');');CC.changeServiceTab(this.parentNode);" href="javascript:fGoto();" hidefocus="true" class="ct">发件箱</A></LI> <LI id=sc163 onMouseOver="this.className='over'" onMouseOut="this.className=''"> <A onfocus=this.blur(); onClick="fGoto('CC.goOutlink(\'/163/shanchu/index.jsp.htm\');');CC.changeServiceTab(this.parentNode);" href="javascript:fGoto();" hidefocus="true" class="ct">已删除</A></LI> <LI id=lj163 onMouseOver="this.className='over'" onMouseOut="this.className=''"> <A onfocus=this.blur(); onClick="fGoto('CC.goOutlink(\'/163/laji/index.jsp.htm\');');CC.changeServiceTab(this.parentNode);" href="javascript:fGoto();" hidefocus="true" class="ct">垃圾邮件</A></LI> <LI id=gg163 onMouseOver="this.className='over'" onMouseOut="this.className=''"> <A onfocus=this.blur(); onClick="fGoto('CC.goOutlink(\'/163/guanggao/index.jsp.htm\');');CC.changeServiceTab(this.parentNode);" href="javascript:fGoto();" hidefocus="true" class="ct">广告邮件</A></LI> <LI id=tx163 onMouseOver="this.className='over'" onMouseOut="this.className=''"> <A onfocus=this.blur(); onClick="fGoto('CC.goOutlink(\'/163/tongxun/index.jsp.htm\');');CC.changeServiceTab(this.parentNode);" href="javascript:fGoto();" hidefocus="true" class="ct">通讯录</A></LI> </ul> </div> <div class="cnav gSb-sservice"> <div class="gSb-cnav-titt"> <a href="javascript:fGoto();" id="lnkServiceTogglee" class="fn-bg opned" title="收起邮箱服务" hidefocus="true" onClick="this.className=(this.className=='fn-bg opned'?'fn-bg clded':'fn-bg opned');$('ulServiceFolderss').toggle();"></a><a href="javascript:fGoto();" class="ct" onClick="$('lnkServiceTogglee').onclick()" hidefocus="true">邮箱服务</a> </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值