原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有的对象来创建新的对象,而不是通过构造函数进行实例化。这个模式的核心思想是“克隆”现有对象,以获得新的实例,尤其是在创建成本较高的情况下非常有用。
原型模式通常涉及以下几个角色:
- 原型(Prototype):定义一个接口,用于创建自身的克隆对象。
- 具体原型(ConcretePrototype):实现原型接口,并实现一个或多个具体的克隆方法。
- 客户端(Client):使用原型对象来创建新的实例。
工作原理
- 创建原型接口:定义一个可以克隆自身的接口。
- 实现具体原型:实现原型接口的具体类,重写克隆方法以创建自己的副本。
- 使用原型:客户端通过调用原型的克隆方法来创建新的对象实例。
示例
// 原型接口
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);
}
优点
- 性能优化:创建新对象的成本较低,因为通过复制现有对象来创建新对象。
- 避免复杂的构造过程:避免了新对象的复杂初始化过程,尤其是在对象的创建涉及复杂参数或配置时。
缺点
- 克隆复杂性:对于某些复杂对象,克隆过程可能涉及深拷贝,可能会比较复杂。
- 对象关系管理:克隆可能需要处理对象内部的引用关系和依赖关系,以确保新对象的一致性。
原型模式非常适合用于需要大量重复创建相似对象的场景,特别是在创建新对象的代价较高时。
标签:克隆,user1,对象,创建,模式,原型,User From: https://www.cnblogs.com/20lxj666/p/18384783