zgq105 / blog

2 stars 0 forks source link

设计模式之原型模式 #32

Open zgq105 opened 5 years ago

zgq105 commented 5 years ago

image

1. 什么是原型模式?有什么作用?

原型模式是创建型设计模式之一,指通过拷贝原有对象的方式实现对象的创建;从而提高了对象创建的效率。

2. 如何实现?

public class Book implements Cloneable {

    private double price;
    private String name;

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

在java中,通过实现接口Cloneable,同时重写Object#clone方法便可实现克隆操作,即可实现原型模式。

3. JDK或Android的应用举例

在JDK大量使用了原型模式,比如ArrayList#clone等;在Android SDK中,也使用大量的原型模式,比如Intent#clone等。

4. 浅拷贝、深拷贝

浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。

深拷贝:当一个类的拷贝方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝。

//浅拷贝示例代码

 @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

//深拷贝示例代码

public class Book implements Cloneable {

    private double price;
    private String name;
    private Merchant merchant;

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Merchant getMerchant() {
        return merchant;
    }

    public void setMerchant(Merchant merchant) {
        this.merchant = merchant;
    }

    @Override
    public Object clone() {
        try {
            Book book = (Book) super.clone();
            book.setMerchant((Merchant) this.merchant.clone());
            return book;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

public class Merchant implements Cloneable {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

5. 小结

原型模式就是在原有对象的基础上,提高创建对象的效率。