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

简介

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

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

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

实现

假设我们有一个名为Book的类,它包含了书的基本属性,如书名、作者和出版商。我们想要使用原型模式来复制这个类的对象,以便可以在程序中动态地创建多个不同状态的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类包含了三个属性:titleauthorpublisher,以及一个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() + 	")");
	}
}

在这个示例中,我们首先创建一个原型对象prototype,然后使用该对象的clone方法来创建两个新的Book对象。我们分别修改了这两个对象的属性,以展示它们具有不同的状态。最后,我们输出了这两个对象的属性值。

原型模式的优缺点

优点

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

缺点

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

总结

原型模式是一种用于对象复制的设计模式。它通过复制现有对象来创建新的对象,从而降低了对象创建成本。虽然原型模式有一些缺点,例如必须复制对象的所有属性和克隆大量数据的成本,但是它仍然是一个有用的设计模式,特别是在需要创建相似对象或保护现有对象状态的场景中。

05-06 11:11