设计模式--原型模式

原型模式介绍

原型模式是一种创建型设计模式,它允许在运行时通过复制现有对象来创建新对象,而不是通过构造函数创建。这个模式的核心思想是基于一个现有的对象克隆一个新的对象,这个过程对外部世界是透明的,就像对象从未被克隆过一样。

原型模式的一个关键优点是可以避免在创建对象时重复性地执行复杂的初始化操作,从而提高了程序的性能和可维护性。与其他创建型模式相比,原型模式的一个显著特点是允许使用原型对象来生成多个具有不同状态的克隆对象。

与工厂模式相比,原型模式不需要创建具体的工厂类来创建新的对象,而是通过复制一个现有对象来生成新的对象。与建造者模式相比,原型模式不需要分步骤创建一个对象,而是通过克隆现有对象来生成新的对象。

原型模式Java实现

假设我们有一个名为Book的类,它包含了书的基本属性,如书名、作者和出版商。我们想要使用原型模式来复制这个类的对象,以便可以在程序中动态地创建多个不同状态的Book对象

public class Book implements Cloneable {
    private String title;
    private String author;
    private String publisher;

    public Book(String title, String author, String publisher) {
        this.title = title;
        this.author = author;
        this.publisher = publisher;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    public String getPublisher() {
        return publisher;
    }

    public Book clone() {
        try {
            return (Book) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}

Book类中实现了Cloneable接口,这是使用原型模式必须的步骤。Book类包含了三个属性:title、author和publisher,以及一个clone方法。clone方法使用Java提供的Object.clone方法来复制一个新的Book对象。

下面是在Java中使用原型模式创建新的Book对象的示例代码:

public class PrototypeDemo {
    public static void main(String[] args) {
        
    Book prototype = new Book("Design Patterns", "Erich Gamma, Richard Helm, Ralph Johnson, 
                                  "John Vlissides","Addison-Wesley Professional");
	Book book1 = prototype.clone();
	book1.setTitle("Head First Design Patterns");
	System.out.println("Book 1: " + book1.getTitle() + " by " + book1.getAuthor() +
                       " (published by " + book1.getPublisher() + ")");
	Book book2 = prototype.clone();
	book2.setAuthor("Joshua Bloch");
	System.out.println("Book 2: " + book2.getTitle() + " by " + book2.getAuthor() + 
                       " (published by " + book2.getPublisher() + 	")");
	}
}

原型模式的优缺点

优点

  • 通过原型模式,我们可以避免创建复杂对象时的开销。
  • 原型模式提供了一种更加灵活的方式来创建新对象。
  • 原型模式能够保护现有对象的状态。

缺点

  • 在实现原型模式时,必须注意克隆对象的所有属性,包括私有属性和引用类型属性。
  • 如果原型对象的属性包含大量数据,那么复制对象的成本将会很高。
  • 需要实现Cloneable接口,并且需要重写clone方法,这会增加代码量和复杂度。
  • 克隆对象时需要注意深浅拷贝的问题,以免出现意料之外的错误。