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

    原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    原型模式的核心是一个clone方法,通过该方法进行对象的拷贝。

    代码实例

    public class Think implements Cloneable{
        private String str;
        
        public Think(){
            
        }
        
        @Override
        public Think clone(){
            Think think = null;
            try{
                think = (Think)super.clone();
            }catch(CloneNotSupportedException e){
                e.printStackTrace();
            }
        }
    }
    
    public class Client{
        public static void main(String args[]){
            Think think = new Think();
            Think cloneThink = think.clone();
        }
    }

    原型模式的优点:性能更加优良,逃避了构造函数的约束。

    在原型模式中,克隆的对象不会执行构造函数。因为clone方法的原理是从内存中(具体地说就是堆内存)以二进制流的方式进行拷贝,重新分配一个内存块。

    拷贝分为两种,浅拷贝和深拷贝。

    代码实例

    public class Think implements Cloneable{
        private ArrayList<String> arrayList = new ArrayList();
        
        public Think(){
            
        }
        
        //浅拷贝
        @Override
        public Think clone(){
            Think think = null;
            try{
                think = (Think)super.clone();
            }catch(CloneNotSupportedException e){
                e.printStackTrace();
            }
        }
        
        //深拷贝
        @Override
        public Think clone(){
            Think think = null;
            try{
                think = (Think)super.clone();
                thing.arrayList = (ArrayList<String>)this.arrayList.clone();
            }catch(CloneNotSupportedException e){
                e.printStackTrace();
            }
        }
    }

    从实例中看到深拷贝与浅拷贝的区别在于是否拷贝ArrayList对象。

    Java中clone方法只是拷贝对象,对于对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种就是浅拷贝。这样就是两个对象共享了一个私有的变量。对于String类型,在clone中也会进行拷贝的,与基本数据类型一样。

    而在覆写clone方法是把内部的引用对象和数组一起拷贝,这种叫深拷贝。

    对于已被final修饰的对象,是不能被拷贝的。

    说白了原型模式的作用就是使得创建对象时不需从零开始,直接在原有的对象的基础上做改动就可以。

  • 相关阅读:
    剑指offer39-平衡二叉树
    剑指offer37-数字在排序数组中出现的次数
    剑指offer36-两个链表的第一个公共结点
    剑指offer31-整数中1出现的次数
    剑指offer30-连续子数组的最大和
    剑指offer28-数组中出现次数超过一半的数字
    剑指offer26-二叉搜索树与双向链表
    剑指offer21-栈的压入、弹出序列
    剑指offer16-合并两个排序的链表
    C#-杂碎
  • 原文地址:https://www.cnblogs.com/maple92/p/6684058.html
Copyright © 2011-2022 走看看