zoukankan      html  css  js  c++  java
  • 原型模式(Prototype Pattern)--对象的克隆

    • 定义:使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;
    • 原型类的核心在于如何实现克隆方法:
      • 能够实现克隆的Java类必须实现一个标识接口Cloneable,表示这个类支持被复制;
      • 通用实现方法;
      • 利用Object类的clone()方法;
    // 1. 通用实现方法
    // 通用的克隆实现方法是在具体原型类的克隆方法中实例化一个与自身类型相同的对象并将其返回,并将相关
    // 参数传入新创建的对象中,保证它们的成员属性相同
    class ConcretePrototype implements Prototype{
        private String attr;    // 成员属性
        public void setAttr(String attr){
            this.attr = attr;
        }
    
        public String getAttr(){
            return this.attr;
        }
    
        // 克隆方法
        public Prototype clone(){
            Prototype prototype = new ConcretePrototype(); // 创建新对象
            prototype.setAttr(this.attr);
            return prototype;
        }
    }
    
    // 使用: 只需要创建一个ConcretePrototype对象作为原型对象,然后调用其clone()方法即可得到对应的克隆对象
    Prototype obj1 = new ConcretePrototype();
    obj1.setAttr("Hello");
    Prototype obj2 = obj1.clone();
    
    // 2. 利用Object类的clone()方法
    //      在派生类中覆盖基类的clone()方法,并声明为public;
    //      在派生类的clone()方法中,调用super.clone();
    //      派生类需实现Cloneable接口;
    // Object类相当于抽象原型类,所有实现了Cloneable接口的类相当于具体原型类;
    class ConcretePrototype implements Cloneable{
        ...
        public Prototype clone(){
            Object object = null;
            try{
                object = super.clone();
                return (Prototype)object;
            } catch(CloneNotSupportedException exception){
                System.err.println("Not support cloneable");
                return null;
            }
        }
        ...
    }
    

    参考资料:

  • 相关阅读:
    对拍源码QwQ
    BZOJ-3875: [Ahoi2014&Jsoi2014]骑士游戏(SPFA+DP)
    2017年10月19日23:31:57
    BZOJ-1064: [Noi2008]假面舞会 (综合性图论题)
    BZOJ-1002: [FJOI2007]轮状病毒(打表找规律or递推 + 高精度)
    BZOJ1397 Ural 1486 Equal squares
    BZOJ3417 Poi2013 Tales of seafaring
    BZOJ2286 [Sdoi2011消耗战
    BZOJ1370 [Baltic2003]Gang团伙
    BZOJ2530 [Poi2011]Party
  • 原文地址:https://www.cnblogs.com/linkworld/p/8978484.html
Copyright © 2011-2022 走看看