zoukankan      html  css  js  c++  java
  • java设计模式之原型模式

    一、原型模式简介
    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
    使用场景: 
    1、资源优化场景。 
    2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
    3、性能和安全要求的场景。 
    4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 
    5、一个对象多个修改者的场景。 
    6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。 
    7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。
    注意事项:
    与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅复制实现 Cloneable,重写clone方法,深复制是通过实现 Serializable 读取二进制流。


    二、原型模式的实现
    1、浅复制实现
    浅复制将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
    class Prototype implements Cloneable { //实现Cloneable接口   
        public Prototype clone(){    //重写clone()方法
            Prototype prototype = null;    
            try{    
                prototype = (Prototype)super.clone(); 
            }catch(CloneNotSupportedException e){    
                e.printStackTrace();    
            }    
            return prototype;     
        }    
    }    


    使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。


    2、深复制
    深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
    public class Prototype implements Serializable {//深复制实现Serializable接口
      
        private static final long serialVersionUID = 1L;  
        private String string;  
      
        private SerializableObject obj;  
      
        //深复制  
        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 String getString() {  
            return string;  
        }  
      
        public void setString(String string) {  
            this.string = string;  
        }  
      
        public SerializableObject getObj() {  
            return obj;  
        }  
      
        public void setObj(SerializableObject obj) {  
            this.obj = obj;  
        }  
      
    }  
      
    class SerializableObject implements Serializable {  
        private static final long serialVersionUID = 1L;  
    }  




    三、总结
    至此,创建型模式已经总结完毕。这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用新的运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。



  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653232.html
Copyright © 2011-2022 走看看