美文网首页爱编程,爱生活
Java设计模式<原型模式>

Java设计模式<原型模式>

作者: 熬夜的猫头鹰 | 来源:发表于2018-06-16 21:23 被阅读17次

    Java设计模式<原型模式>

    意图

    原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。本小结会通过对象的复制,进行讲解。在Java中,复制对象是通过clone()实现的,先创建一个原型类:

    优点

    • 性能提高
    • 逃避构造函数的约束

    场景

    • 资源优化场景
    • 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等
    • 性能和安全要求的场景
    • 通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
    • 一个对象多个修改者的场景
    • 个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用

    与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流

    Demo

    public  class Worker implements Cloneable {
    
        private String name;
    
        protected String sex;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        //浅复制
        protected Object clone() {
            Object clone = null;
            try {
                clone = super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return clone;
        }
        //深复制
        public Object deepClone() throws IOException, ClassNotFoundException {  
      
            /* 写入当前对象的二进制流 */
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);  
      
            /* 读出二进制流产生的新对象 */
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return ois.readObject();
        }
    
    
    public class DemoMain {
    
        public static void main(String[] args) {
            Worker worker = new Worker();
            worker.setName("name");
            worker.setSex("boy");
            Worker worker1 = (Worker) worker.clone();
            System.err.println(worker1.getName());
        }
    }
    
    

    相关文章

      网友评论

        本文标题:Java设计模式<原型模式>

        本文链接:https://www.haomeiwen.com/subject/bjzbeftx.html