码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式学习(四) 原型模型

时间:2015-04-14 00:11:23      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

使用场景

-- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式

-- 就是java中的克隆技术,以某个对象为原型复制出新的对象 ,显然,新的对象具备原型对象的特点

优势:

效率高(直接克隆,避免了重新执行构造的过程步骤)。

克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同,并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值

 

原型模式实现:

  -- Cloneable接口和clone方法

  -- ProtoType模式中实现起来最困难的地方就是内存复制操作,所幸在java中提供了clone方法替我们做的绝大部分事情

 

浅复制代码:

技术分享
package com.lp.prototype;

import java.util.Date;

public class Sheep implements Cloneable {
    private String name;
    private Date birthday;
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();//直接调用Object的clone方法    
        return obj;
    }

    public Sheep(String name, Date birthday) {
        super();
        this.name = name;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    
    Sheep(){
        
    }
    
    

}
sheep类
技术分享
package com.lp.prototype;

import java.util.Date;

public class Client {
    public static void main(String[] args) throws Exception{
        Date date = new Date(1861381234L);
        Sheep s1 = new Sheep("多利",date);
        Sheep s2 = (Sheep)s1.clone();
        
        date.setTime(23456789L);
        s1.setBirthday(date);
        
        s1.setName("少利");
        System.out.println(s1.getName());
        System.out.println(s1.getBirthday());
        System.out.println(s1);
        
        System.out.println(s2.getName());
        System.out.println(s2.getBirthday());
        System.out.println(s2);
        //这里s1 和s2 的对象不同 但是值是一样的
        //浅复制只复制一个对象的值类型数据和引用的地址   
        // 所以他们两个的date对象指的是同一个对象  故而只要修改其中的一个的值 另外一个还会发生变化
    }
}
Client

 结果:

技术分享

这里修改了日期对象  ,他们两个的值都变化了  可见复制的不是对象的全部引用类型只是复制了引用而不是对象。

 

深复制代码:

技术分享
package com.lp.prototype;

import java.util.Date;

public class Sheep implements Cloneable {
    private String name;
    private Date birthday;
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();//直接调用Object的clone方法
        
        //添加如下代码实现深复制
        Sheep s = (Sheep)obj;
        s.birthday= (Date)this.birthday.clone();
        
        
        return obj;
    }

    public Sheep(String name, Date birthday) {
        super();
        this.name = name;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    
    Sheep(){
        
    }
    
    

}
sheep
技术分享
package com.lp.prototype;

import java.util.Date;

public class Client {
    public static void main(String[] args) throws Exception{
        Date date = new Date(1861381234L);
        Sheep s1 = new Sheep("多利",date);
        Sheep s2 = (Sheep)s1.clone();
        
        date.setTime(23456789L);
        s1.setBirthday(date);
        
        s1.setName("少利");
        System.out.println(s1.getName());
        System.out.println(s1.getBirthday());
        System.out.println(s1);
        
        System.out.println(s2.getName());
        System.out.println(s2.getBirthday());
        System.out.println(s2);
        //这里s1 和s2 的对象不同 但是值是一样的
        //浅复制只复制一个对象的值类型数据和引用的地址   
        // 所以他们两个的date对象指的是同一个对象  故而只要修改其中的一个的值 另外一个还会发生变化
    }
}
client

结果:

技术分享

这样就可以实现深复制了

 

设计模式学习(四) 原型模型

标签:

原文地址:http://www.cnblogs.com/lipeng0824/p/4423518.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!