原型模式

原型模式:就是不用通过new来产生对象,而是通过克隆来产生新的对象。

下面主要是通过电子账单例子来介绍:
第一是没有用原型模式实现的:记得我是一个类一个类的代码复制上去的。

 

package patten.prototyprPattern;

public class AdvTemplate {
    //广告信的名称
    private String advSubject = "xx银行国庆信用卡抽奖活动";
    //广告信的内容
    private String advContext = "国庆抽奖活动通知:只要刷卡就送你100万,,";
    //取得广告信的名称
    public String getAdvSubject() {
        return advSubject;
    }
    //取得广告信的内容
    public String getAdvContext() {
        return advContext;
    }
}

 

 

package patten.prototyprPattern;

public class Mail {
    //收件人
    private String receiver;
    //邮件名称
    private  String subject;
    //称谓
    private String application;
    //邮件的内容
    private String context;
    //邮件尾部
    private String tail;


    //构造函数
    public Mail(AdvTemplate advTemplate){
        this.context = advTemplate.getAdvContext();
        this.subject = advTemplate.getAdvSubject();
    }
    //以下是getter和setter方法
    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 getApplication() {
        return application;
    }

    public void setApplication(String application) {
        this.application = application;
    }

    public String getContext() {
        return context;
    }

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

    public String getTail() {
        return tail;
    }

    public void setTail(String tail) {
        this.tail = tail;
    }
}




package patten.prototyprPattern;

import java.util.Random;

public class Client {
    //发送账单的数量是数据库提取的
    private static int MAX_COUNT = 6;


    public static void main(String[] args) {
        //模拟发邮件
        int i = 0;
        //将模板定义出来,这是从数据库中获取的
        Mail mail = new Mail(new AdvTemplate());
        mail.setTail("xx银行版权所有");
        while(i < MAX_COUNT){
            //以下是每封邮件的不同地方
            mail.setApplication(getRandString(5)+"先生(女生)");
            mail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
            //然后发送邮件
            sendMail(mail);
            i++;
        }
    }


    //发送邮件
    public  static void sendMail(Mail mail){
       System.out.println("标题:"+mail.getSubject()+"\t收件人:"+mail.getReceiver()+"\t...发送成功!");

    }

    //获取指定长度的随机字符
    public static String getRandString(int maxLength){
        String source = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
        StringBuffer sb = new StringBuffer();
        Random rand = new Random();
        for(int i = 0;i<maxLength ;i++){
            sb.append(source.charAt(rand.nextInt(source.length())));
        }
        return sb.toString();
    }
}

 

 

下面是用原型模式来实现的:你们可以对比一下:大字的是变化的

  

package patten.prototyprPattern2;

public class AdvTemplate {
    //广告信的名称
    private String advSubject = "xx银行国庆信用卡抽奖活动";
    //广告信的内容
    private String advContext = "国庆抽奖活动通知:只要刷卡就送你100万,,";
    //取得广告信的名称
    public String getAdvSubject() {
        return advSubject;
    }
    //取得广告信的内容
    public String getAdvContext() {
        return advContext;
    }
}

 

 

 

 

package patten.prototyprPattern2;

public class Mail implements Cloneable{
    //收件人
    private String receiver;
    //邮件名称
    private  String subject;
    //称谓
    private String application;
    //邮件的内容
    private String context;
    //邮件尾部
    private String tail;

    //修改后的邮件类
    @Override
    public Mail clone(){
        Mail mail = null;
        try{
            mail = (Mail)super.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return mail;
    }


    //构造函数
    public Mail(AdvTemplate advTemplate){
        this.context = advTemplate.getAdvContext();
        this.subject = advTemplate.getAdvSubject();
    }
    //以下是getter和setter方法
    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 getApplication() {
        return application;
    }

    public void setApplication(String application) {
        this.application = application;
    }

    public String getContext() {
        return context;
    }

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

    public String getTail() {
        return tail;
    }

    public void setTail(String tail) {
        this.tail = tail;
    }
}

 

 

 

package patten.prototyprPattern2;

import java.util.Random;

public class Client {
    //发送账单的数量是数据库提取的
    private static int MAX_COUNT = 6;


    public static void main(String[] args) {
        //模拟发邮件
        int i = 0;
        //将模板定义出来,这是从数据库中获取的
        Mail mail = new Mail(new AdvTemplate());
        mail.setTail("xx银行版权所有");
        while(i < MAX_COUNT){
            //以下是每封邮件的不同地方
              Mail cloneMail = mail.clone();
            cloneMail.setApplication(getRandString(5)+"先生(女生)");
            cloneMail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
            //然后发送邮件
            sendMail(cloneMail);
            i++;
        }
    }


    //发送邮件
    public  static void sendMail(Mail mail){
       System.out.println("标题:"+mail.getSubject()+"\t收件人:"+mail.getReceiver()+"\t...发送成功!");

    }

    //获取指定长度的随机字符
    public static String getRandString(int maxLength){
        String source = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
        StringBuffer sb = new StringBuffer();
        Random rand = new Random();
        for(int i = 0;i<maxLength ;i++){
            sb.append(source.charAt(rand.nextInt(source.length())));
        }
        return sb.toString();
    }
}

 

posted @ 2021-01-23 14:05  赚钱买个打印机  阅读(94)  评论(0编辑  收藏  举报