• 原型模式


    原型模式(Prototype Pattern)

    定义:Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)

    原型模式通用代码:

    public class PrototypeClass  implements Cloneable{
         //覆写父类Object方法
         @Override
         public PrototypeClass clone(){
                 PrototypeClass prototypeClass = null;
                 try {
                        prototypeClass = (PrototypeClass)super.clone();
                 } catch (CloneNotSupportedException e) {
                        //异常处理
                 }
                 return prototypeClass;
         }
    }

    原型模式实际上就是实现Cloneable接口,重写clone()方法。

    使用原型模式的优点:

    ● 性能优良

    原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。

    ● 逃避构造函数的约束

    这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的(参见13.4节)。

    使用场景:

    ● 资源优化场景

    类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。

    ● 性能和安全要求的场景

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

    ● 一个对象多个修改者的场景

    一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

    浅拷贝和深拷贝:

    浅拷贝:Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝,其他的原始类型比如int、long、char、string(当做是原始类型)等都会被拷贝。

    注意: 使用原型模式时,引用的成员变量必须满足两个条件才不会被拷贝:一是类的成员变量,而不是方法内变量;二是必须是一个可变的引用对象,而不是一个原始类型或不可变对象。

    深拷贝:对私有的类变量进行独立的拷贝    

      如:thing.arrayList = (ArrayList<String>)this.arrayList.clone();

    实现

    步骤 1

    /*
    定义一个用户类,类中重写clone方法
    */
    public class User implements Cloneable {

    private String name;
    private String sex;
    private String age;



    public void setUserInfo(String name,String sex,String age)
    {

    this.name=name;
    this.sex=sex;
    this.age=age;

    }

    public void display()
    {

    System.out.println("name:"+name+"sex:"+sex+"age:"+age);
    }

    @Override
    protected User clone() throws CloneNotSupportedException {
    // TODO Auto-generated method stub
    return (User)super.clone();

    }



    }

    步骤 2

    /*
    原型模式(Prototype Pattern)
    */
    public class PrototypePatternDescription {

    public static void main(String[] args) throws CloneNotSupportedException{
    User user = new User();
    user.setUserInfo("李明","男","20");
    user.display();

    User u=(User)user.clone();
    u.setUserInfo("李明","男","20");
    u.display();



    }

    }

    结果:

    name:李明sex:男age:20
    name:李明sex:男age:20

  • 相关阅读:
    JWPlayer Uncaught Error: Invalid SRT file
    京东电商API
    map, string 强大的STL
    VFL演示样例
    sizeof小览
    Java中httpClient中三种超时设置
    Windows下Mysql5.6启用监控执行脚本的日志
    实时监控MySql状态
    实时监控mysql数据库变化
    SVN命令使用详解
  • 原文地址:https://www.cnblogs.com/shumeigang/p/13099207.html
Copyright © 2020-2023  润新知