原型模式及其实例


前言

原型模式是23种设计模式中的创建型模式:
创建型模式是设计模式中的一类,用于创建对象的方式和机制。它们提供了一种灵活的方式来实例化对象,同时隐藏了对象的创建细节,使代码更可维护、可扩展和可复用


一、原型模式

当我们需要创建多个相似对象时,使用原型模式是一种有效的设计模式。原型模式通过克隆现有对象来创建新的对象,避免了重复的对象创建过程,提高了性能和代码的可维护性。在软件开发中,我们经常遇到需要创建大量相似对象的情况。传统的创建对象方式是通过调用构造函数来实例化新对象,这种方式在创建复杂对象时可能会导致性能问题。此外,构造函数的参数列表可能会变得冗长,使得代码难以维护和理解。原型模式提供了一种解决方案,它基于现有对象创建新对象,而无需通过构造函数和初始化参数。

工作原理:
一个对象作为原型,通过复制(克隆)来创建新的对象。在Java中,可以通过实现Cloneable接口和重写clone()方法来实现对象的克隆操作。

在这里插入图片描述

二、浅拷贝与深拷贝

1.浅拷贝

**浅拷贝(Shallow Copy):**浅拷贝是创建一个克隆对象,并复制原始对象的字段值。如果字段是值类型,则复制其值;如果字段是引用类型,则复制引用,这样原始对象和克隆对象将共享相同的引用对象。浅拷贝的克隆对象与原始对象之间存在一定的关联。两者共用同一个地址,并未开辟新的内存地址。

2.深拷贝

深拷贝(Deep Copy):
深拷贝是创建一个克隆对象,并复制原始对象的字段值,包括引用对象。深拷贝会递归地复制引用对象,使得原始对象和克隆对象完全独立,互不影响。更像是创建了一个新对象后将原对象的属性赋值给新对象,新对象有自己的内存地址,与原对象独立。

三、代码示例

1,Address类
它是Person类的一个属性

public class Address {
    private String city;

    public Address(String city) {
        this.city = city;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

2、Person类
实验对象,实现了Cloneable,重写clone方法

public class Person implements Cloneable{
    private String name;
    private Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

3、测试类
在下面的测试类中,分别用浅拷贝与深拷贝两种不同的方式创建了克隆对象,再与原对象做对比,来比较两种方式的不同。
浅克隆对象与原对象对比: true,两者地址相同,内容相同
修改后的浅克隆对象与原对象对比: true,同一地址,修改后同时变化
深克隆对象与原对象对比: false,值相同但是地址不同,所以==判断错误
修改后的深克隆对象与原对象对比: false 地址不同所以修改对原对象无效。
注意:==比较的是值与地址,equals只对比其值

public class PrototypeExample {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address address = new Address("New York");
        Person person1 = new Person("John", address);

        // 浅拷贝
        Person person2 = (Person) person1.clone();
        System.out.println("浅拷贝地址相同:" + (person1.getAddress() == person2.getAddress()));

        // 修改person2的地址
        person2.getAddress().setCity("Los Angeles");
        System.out.println("浅拷贝地址同时改变:" + (person1.getAddress().getCity().equals(person2.getAddress().getCity())));

        // 深拷贝
        Person person3 = new Person(person1.getName(), new Address(person1.getAddress().getCity()));
        System.out.println("深拷贝地址不同:" + (person1.getAddress() == person3.getAddress()));

        // 修改person3的地址
        person3.getAddress().setCity("San Francisco");
        System.out.println("深拷贝地址独立:" + (person1.getAddress().getCity().equals(person3.getAddress().getCity())));
    }
}

总结

原型模式是一种创建型模式,通过复制现有对象来创建新对象。它提供了一种灵活、高效的对象创建方式,可以在需要大量相似对象的场景中提高性能和代码的可维护性。通过使用浅拷贝或深拷贝,原型模式可以灵活地克隆对象,使得新对象与原始对象相互独立。

猜你喜欢

转载自blog.csdn.net/a545__27/article/details/132266664
今日推荐