美文网首页
设计模式-原型模式

设计模式-原型模式

作者: liuzhimi | 来源:发表于2019-04-12 12:39 被阅读0次

介绍

原型模式通过复制创建复杂或构造耗时的实例。

主要解决:在运行期建立和删除原型的场景。
使用场景
1.类初始化需要消耗较多的资源,这个资源包括数据、硬件资源。
2.通过new产生一个对象需要非常繁琐的数据准备或访问权限。
3.一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

优点
1.创建实例实例性能提高
2.逃避构造函数的约束,构造函数不执行

缺点
1.减少约束是优点也是缺点。
2.必须实现Cloneable接口

浅拷贝和深拷贝

  • 浅拷贝:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间。
    所以浅拷贝的情况下,A引用B,修改A时B也会改变。即达不到保护性拷贝。
  • 深拷贝:深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

UML类图

代码实现

Book.java

import java.util.ArrayList;

public class Book implements Cloneable {
    private String article;
    private ArrayList<String> images = new ArrayList<String>();
    
    public Book() {
        System.out.println("Book构造函数");
    }

    public String getArticle() {
        return article;
    }

    public void setArticle(String article) {
        this.article = article;
    }

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

    public void setImages(String image) {
        images.add(image);
    }
    
    @Override
    protected Book clone() {
        try {
            Book book = (Book)super.clone();
            book.article = this.article;
            //浅拷贝
            //book.images = this.images;
            //深拷贝
            book.images = (ArrayList<String>)this.images.clone();
            return book;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public void showBook() {
        System.out.println("Book Start");
        System.out.println("Article:" + article);
        for(String image : images) {
            System.out.println("Image Name:" + image);
        }
        System.out.println("Book End");
    }
    
}

Main.java

public class Main {

    public static void main(String[] args) {
        Book originBook = new Book();
        originBook.setArticle("《今天你吃了吗》");
        originBook.setImages("天空");
        originBook.setImages("大地");
        originBook.showBook();
        
        Book copyBook = originBook.clone();
        copyBook.showBook();
        
        copyBook.setImages("湖泊");
        copyBook.showBook();
        
        originBook.showBook();
    }
}

输出

Book构造函数
Book Start
Article:《今天你吃了吗》
Image Name:天空
Image Name:大地
Book End
Book Start
Article:《今天你吃了吗》
Image Name:天空
Image Name:大地
Book End
Book Start
Article:《今天你吃了吗》
Image Name:天空
Image Name:大地
Image Name:湖泊
Book End
Book Start
Article:《今天你吃了吗》
Image Name:天空
Image Name:大地
Book End

相关文章

网友评论

      本文标题:设计模式-原型模式

      本文链接:https://www.haomeiwen.com/subject/nfpqwqtx.html