原型模式和深度拷贝、浅拷贝

Prototype Pattern(原型模式)

意图

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

适用性

当要实例化的类是在运行时刻指定时,例如,通过动态装载;
为了避免创建一个与产品类层次平行的工厂类层次时;
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

结构

 
参与者:
• Prototype(原型) 
— 声明一个克隆自身的接口。
• ConcretePrototype(具体的原型) 
— 实现一个克隆自身的操作。 
• Client(场景) 

— 让一个原型克隆自身从而创建一个新的对象。 

举例:真假美猴王,每一个美猴王都拥有自己的金箍棒,深拷贝就是每个美猴王都有自己的金箍棒,浅拷贝就是两个美猴王公用一个金箍棒:

import java.io.Serializable;

/**
 * 金箍棒
 */
public class JinGuBang implements Serializable{
    public int Lengh = 100;
    public int diameter = 12;

}



import java.io.*;
import java.util.Date;

/**
 *孙悟空的类
 */
public class SunWuKONG implements Cloneable,Serializable{
    public JinGuBang jinGuBang;
    public Date date = new Date();


    @Override
    protected SunWuKONG clone() throws CloneNotSupportedException {
        /**
         * 浅拷贝
         */
         //return (SunWuKONG) super.clone();
        /**
         * 深拷贝
         */
         return (SunWuKONG)this.deepClone();


    }

    /**
     * 使用字节数组序列化实现深拷贝
     * @param
     * @return
     */
    private Object deepClone(){
       try {
           ByteArrayOutputStream bos = new ByteArrayOutputStream();
           ObjectOutputStream oos = new ObjectOutputStream(bos);
           oos.writeObject(this);


           ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
           ObjectInputStream ois = new ObjectInputStream(bis);
           SunWuKONG copy = (SunWuKONG)ois.readObject();

           return copy;

       }catch (Exception e){
           e.printStackTrace();
           return  null;
       }
    }

}

public class test {
    public static void main(String[] args) throws Exception {

        /**
         * 定一个孙悟空,和他的金箍棒
         */
        JinGuBang j = new JinGuBang();
        SunWuKONG sun = new SunWuKONG();
        sun.jinGuBang = j;
        /**
         * 复制一个美猴王
         */
        SunWuKONG copy = sun.clone();

        /**
         * 选择深度copy或者浅复制都输出的false
         */
        System.out.println(sun == copy);

        /**
         * 选择深度copy输出的false,金箍棒不一样
         * 浅复制输出ture,说明两个悟空拿的金箍棒时一样的
         */
        System.out.println(sun.jinGuBang);
        System.out.println(copy.jinGuBang);
        System.out.println(sun.jinGuBang==copy.jinGuBang);
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值