zoukankan      html  css  js  c++  java
  • 设计模式(七)原型模式(创建型)

    概述 

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。

    原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。

    类图  

    1

    代码  

    以通过群发邮件的例子说明一下:

    public class Mail implements Cloneable {
        private String receiver;
        private String subject;
        private String appellation;
        private String contxt;
        private String tail;
    
        public Mail(String subject, String contxt) {
            super();
            this.subject = subject;
            this.contxt = contxt;
        }    
    
        public String getReceiver() {
            return receiver;
        }
        public void setReceiver(String receiver) {
            this.receiver = receiver;
        }
        public String getAppellation() {
            return appellation;
        }
        public void setAppellation(String appellation) {
            this.appellation = appellation;
        }
        public String getTail() {
            return tail;
        }
        public void setTail(String tail) {
            this.tail = tail;
        }
        public String getSubject() {
            return subject;
        }
        public String getContxt() {
            return contxt;
        }
    
        public Mail clone() {
            Mail mail = null;
            try {
                mail = (Mail) super.clone();
            } catch (CloneNotSupportedException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            return mail;
        }
        
    }
    public class ClientDemo {
        private static int MAX_COUNT = 6;
        public static void main(String[] args)
        {
            int i =0;
            Mail mail = new Mail("群发标题","群发内容");
            mail.setTail("群发结尾");
            Random rand = new Random();
            while(i < MAX_COUNT)
            {
                Mail cloneMail = mail.clone();
                cloneMail.setAppellation("尊称"+rand.nextInt(100)+":");
                cloneMail.setReceiver(rand.nextInt(1000000000)+"@qq.com");
                sendMail(cloneMail);
                i++;
            }
        }
        
        public static void sendMail(Mail mail)
        {
            System.out.println("标题:"+mail.getSubject()+"	收件人:"+mail.getReceiver()+"	.....发送成功");
        }
    }

    克隆必须满足的条件

    a.对任何的对象x,都有:x.clone() != x,即克隆对象与原对象不是同一个对象。

    b.对任何的对象x,都有:x.clone().getClass() == x.get getClass(),即克隆对象与原对象的类型是一样的。

    c.如果对象x的equals()方法定义恰当的话,那么x.clone().equals(x)应当是成立的。

    浅复制复制了值类型对象,对于引用类型对象,只复制了引用,它指向原来引用的对象。Java中clone为浅复制。

    深复制对值类型和引用类型的对象都生成一份新的拷贝. Java中可以通过串行化来进行深复制,前提是对象以及对象内部所引用的对象都是可串行化的,否则需要考虑将那些不可串行化的对象可否设为transient,排除在复制过程之外。

    我是天王盖地虎的分割线  

    image

    源代码:http://pan.baidu.com/s/1dD1Qx01

    java原型.zip

  • 相关阅读:
    实例属性 类属性 实例域 类域
    研究数据集
    static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
    accessor mothod mutator mothod 更改器方法 访问器方法 类的方法可以访问类的任何一个对象的私有域!
    上钻 下钻 切片 转轴 降采样
    识别会话
    Performance Tuning Using Linux Process Management Commands
    Secure Hash Algorithm 3
    grouped differently across partitions
    spark 划分stage Wide vs Narrow Dependencies 窄依赖 宽依赖 解析 作业 job stage 阶段 RDD有向无环图拆分 任务 Task 网络传输和计算开销 任务集 taskset
  • 原文地址:https://www.cnblogs.com/yydcdut/p/3856419.html
Copyright © 2011-2022 走看看