Note

春蚕到死丝方尽,人至期颐亦不休,一息尚存须努力,留作青年为范畴。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

介绍

概念:由对象来生成新的对象,而不是用类类型或其他方式.

使用场景:需要对象克隆时

特点:参数复制了,不用再初始化数据

 

原型模式在C++等其他语言中运用较广,JAVA有Object的clone方法,所以使用起来比较简单

首先假如Object中没有clone方法,怎么来实现原型模式?

代码:

首先创建对象实体

//基类

package note.com.bean;

public abstract class Prototype {
    private String name = null;
    
    public abstract Prototype clone(Prototype p);
    
    public String getName() {
        return name;
    }

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

//子类

package note.com.bean;

public class Prototype1 extends Prototype {
    
    public Prototype clone(Prototype p){
        Prototype pp = new Prototype1();
        pp.setName(this.getName());
        return pp;
    }



}

//测试类

package note.com.prototype;

import note.com.bean.Prototype;
import note.com.bean.Prototype1;

public class PrototypeTest {

    public static void main(String[] args) {
        Prototype p1 = new Prototype1();
        p1.setName("1");
        System.out.println(p1);
        System.out.println(p1.getName());
        Prototype p11 = p1.clone(p1);
        System.out.println(p11);
        System.out.println(p11.getName());
    }
}

//结果

note.com.bean.Prototype1@659e0bfd
1
note.com.bean.Prototype1@2a139a55
1
可得,对象已经是新的对象,但内容是相同的.

 

使用JAVA的clone方法以后可以这么写,或者不重写clone方法,直接使用

代码:

//子类

package note.com.bean;

public class Prototype2 extends Prototype{
    
    public Prototype clone(Prototype p){
        Prototype pp = null;
        try {
            pp = (Prototype) this.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return pp;
    }
    
    
}

 

 

注意:Object中的clone是浅克隆,如果想使用深克隆,就要自定义clone方法了(利用序列化实现深克隆属性)

代码:

//克隆方法:

 public  Object deepClone(Object o) throws IOException, ClassNotFoundException{
        //将对象写到流里
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(o);
        //从流里读回来
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }

 

posted on 2016-03-01 10:59  'Note'  阅读(227)  评论(0编辑  收藏  举报