通俗易懂的java设计模式之 –原型模式

  • Post author:
  • Post category:java


原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过实例化构造函数来创建新对象。在 Java 中,实现原型模式通常使用 Cloneable 接口和 clone() 方法。

下面是一个简单的例子来说明原型模式的使用。假设我们有一个包含一些基本数据类型和对象引用的复杂对象,我们希望创建该对象的副本而不是新的实例。这种情况下,我们可以使用原型模式来克隆对象,而不必重新创建对象。

首先,我们定义一个可克隆的类 Person,并实现 Cloneable 接口和 clone() 方法:

public class Person implements Cloneable {
    private String name;
    private int age;
    private List<String> hobbies;
    
    public Person(String name, int age, List<String> hobbies) {
        this.name = name;
        this.age = age;
        this.hobbies = hobbies;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public List<String> getHobbies() {
        return hobbies;
    }
    
    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }
    
    @Override
    public Object clone() throws CloneNotSupportedException {
        Person clonedPerson = (Person) super.clone();
        clonedPerson.hobbies = new ArrayList<>(hobbies);
        return clonedPerson;
    }
}

在上面的代码中,我们定义了一个 Person 类,它包含三个属性:name、age 和 hobbies。我们实现了 Cloneable 接口,并重写了 clone() 方法。在 clone() 方法中,我们首先调用父类的 clone() 方法,然后克隆 hobbies 属性。由于 hobbies 是一个 List 对象,因此我们使用 ArrayList 的构造函数来创建一个新的 List 对象,其中包含与原始对象相同的元素。

现在,我们可以使用 Person 类来创建一个原型对象,并使用 clone() 方法来创建该对象的副本:

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        List<String> hobbies = new ArrayList<>();
        hobbies.add("reading");
        hobbies.add("swimming");
        Person originalPerson = new Person("Tom", 20, hobbies);
        Person clonedPerson = (Person) originalPerson.clone();
        clonedPerson.getHobbies().add("traveling");
        System.out.println(originalPerson.getHobbies()); // [reading, swimming]
        System.out.println(clonedPerson.getHobbies()); // [reading, swimming, traveling]
    }
}

在上面的代码中,我们首先创建一个包含两个 hobby 的 Person 对象 originalPerson。然后,我们使用 clone() 方法创建一个新的 Person 对象 clonedPerson,它是 originalPerson 的副本。我们向 clonedPerson 的 hobbies 属性添加一个新元素 “traveling”,并输出 originalPerson 和 clonedPerson 的 hobbies 属性。可以看到,originalPerson 和 clonedPerson 的 hobbies 属性相同,但 clonedPerson 的 hobbies 属性包了一个新的元素 “traveling”。

使用原型模式的优点是可以避免重复创建对象,特别是创建大型对象时,可以大大提高性能。此外,原型模式可以简化对象的创建过程,因为它允许我们通过复制现有对象来创建新对象,而不必了解对象的内部细节。

然而,原型模式也有一些缺点。首先,需要实现 Cloneable 接口和 clone() 方法,这可能会导致代码的复杂性和可读性下降。其次,如果克隆的对象包含引用类型的属性,那么这些属性也需要实现 Cloneable 接口和 clone() 方法,否则克隆的对象可能不完整或不正确。最后,使用原型模式可能会导致对象的状态被共享,这可能会导致意外的副作用。

总之,原型模式是一种非常有用的设计模式,它可以帮助我们复制现有对象来创建新对象。但是,在使用原型模式时,我们需要小心,确保正确地实现 clone() 方法,并注意共享对象状态的风险。



版权声明:本文为zmxnn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。