原型模式

原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有的对象来创建新的对象,而不是通过构造函数进行实例化。这个模式的核心思想是“克隆”现有对象,以获得新的实例,尤其是在创建成本较高的情况下非常有用。

原型模式通常涉及以下几个角色:

  1. 原型(Prototype):定义一个接口,用于创建自身的克隆对象。
  2. 具体原型(ConcretePrototype):实现原型接口,并实现一个或多个具体的克隆方法。
  3. 客户端(Client):使用原型对象来创建新的实例。

工作原理

  1. 创建原型接口:定义一个可以克隆自身的接口。
  2. 实现具体原型:实现原型接口的具体类,重写克隆方法以创建自己的副本。
  3. 使用原型:客户端通过调用原型的克隆方法来创建新的对象实例。

示例

// 原型接口
public interface Prototype extends Cloneable {
    Prototype clone();
}

// 具体原型类
public class User implements Prototype {
    private String name;
    private int age;
    private String sex;
    //用户持有联系类
    private Contact contact;
    
    // 实现克隆方法
    @Override
    public User clone() {
        try {
            //直接克隆是虚引用,属性是对象是复制地址
            //return (User) super.clone();

            //实引用,使用new实现;也可以按照序列化实现
            
            //将对象克隆一份
            User user = (User) super.clone();
            //重新创建一个对象,复值给克隆对象
            user.setContact(new Contact(this.contact.getAddress(),this.contact.getPhone()));
            return user;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException("Cloning not supported", e);
        }
    }
}

//联系类
public class Contact{
    private String address;
    private String phone;
}

//test
 public static void main(String[] args) {
        Contact contact = new Contact("广东", "15899886699");
     
        // 创建一个用户实例
        User user1 = new User("Alice", 30, "Female",contact);
        System.out.println("Original: " + user1);

        // 克隆用户
        User clonedUser1 = user1.clone();
        System.out.println("Cloned:   " + clonedUser1);

        System.out.println("-------------------------------");

        // 修改原型的字段以验证克隆的独立性
        user1.setName("Bob");
        user1.setAge(25);
        user1.setSex("Male");
     
     	//修改联系方式
     	contact.setAddress("海南");
        contact.setPhone("18999886699");

        System.out.println("Modified Original:\n          " + user1);
        System.out.println("Cloned after modification:\n          " + clonedUser1);
    }

优点

  1. 性能优化:创建新对象的成本较低,因为通过复制现有对象来创建新对象。
  2. 避免复杂的构造过程:避免了新对象的复杂初始化过程,尤其是在对象的创建涉及复杂参数或配置时。

缺点

  1. 克隆复杂性:对于某些复杂对象,克隆过程可能涉及深拷贝,可能会比较复杂。
  2. 对象关系管理:克隆可能需要处理对象内部的引用关系和依赖关系,以确保新对象的一致性。

原型模式非常适合用于需要大量重复创建相似对象的场景,特别是在创建新对象的代价较高时。

posted @ 2024-09-17 15:08  疾风不问归途  阅读(50)  评论(0)    收藏  举报