Android 源码设计模式解析与实战 读书笔记 4 原型模式

使程序运行更高效 —— 原型模式

1. 原型模式介绍

原型模式是一个创建型的模式。原型二字表明了该模式应该有一个样板实例,用户从这个样板对象中复制出一个内部属性一致的对象,这个过程也就是我们俗称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可以使程序运行更高效。

2. 原型模式的定义

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

3. 原型模式的使用场景

(1) 类初始化需要消耗非常多的资源,这些资源包括数据、硬件资源等,通过原型拷贝避免这些消耗;
(2) 通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式;
(3) 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

需要注意的是,通过实现 Cloneable 接口的原型模式在调用 clone 函数构造实例时并不一定比通过 new 操作速度快,只有当通过 new 构造对象较为耗时或者说成本较高时,通过 clone 方法才能够获得效率上的提升。因此,在使用 Cloneable 时需要考虑构建对象的成本以及做一些效率上的测试。

4. 原型模式的简单实现

简单的实例:

import java.util.ArrayList;

/**
 * Created by toby on 18-3-16.
 */

public class WordDocument implements Cloneable {

    private String text;
    private ArrayList<String> images = new ArrayList<>();

    @Override
    @SuppressWarnings("unchecked")
    protected WordDocument clone() {
        try {
            WordDocument document = (WordDocument) super.clone();
            document.text = this.text;

//            document.images = this.images;// 这是浅拷贝

            document.images = (ArrayList<String>) this.images.clone(); // 对于引用型字段实现深拷贝

            return document;
        } catch (Exception e){
        }
        return null;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public ArrayList<String> getImages() {
        return images;
    }

    public String getImage(int index) {
        if (index < 0 && index >= images.size()) {
            return "";
        }
        return this.images.get(index);
    }

    public void setImages(ArrayList<String> images) {
        this.images = images;
    }

    public void setImage(String image) {
        this.images.add(image);
    }

    public void showDocument() {
        System.out.println("-------------- Word Content Start ---------------");
        System.out.println("Text: " + text);
        System.out.println("Images List: ");
        for (String imgName : images) {
            System.out.println("image name: " + imgName);
        }
        System.out.println("-------------- Word Content End -----------------");
    }
}

对实例的测试:

public class LearnJava {

    public static void main(String[] args) {
        WordDocument originDoc = new WordDocument();
        originDoc.setText("This is a test document.");
        originDoc.setImage("image 01");
        originDoc.setImage("image 02");
        originDoc.setImage("image 03");
        originDoc.showDocument();

        WordDocument document2 = originDoc.clone();
        document2.showDocument();

        document2.setText("This is a clone document.");
        document2.setImage("new image 04");
        document2.showDocument();

        originDoc.showDocument();
    }
}

优点与缺点

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

缺点:
这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,在实际开发当中应该注意这个潜在的问题。优点是减少了约束,缺点也是减少了约束,需要大家在实际应用时考虑。

    原文作者:赵者也
    原文地址: https://www.jianshu.com/p/284c5f8a0910
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞