设计模式--------原型模式

Posted Topze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--------原型模式相关的知识,希望对你有一定的参考价值。

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

原型模式的核心是一个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修饰的对象,是不能被拷贝的。

 

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

 

以上是关于设计模式--------原型模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之原型模式(Prototype)详解及代码示例

设计模式课程 设计模式精讲 9-2 原型模式coding

设计模式--原型模式

设计模式原型模式

Java设计模式----原型模式

设计模式--------原型模式