3.原型模式
一、引言
在 Java 编程中,原型模式(Prototype)是一种创建对象的方式,通过拷贝原型实例来创建新的对象,为对象的创建提供了一种高效且灵活的途径。本文将详细探讨原型模式的概念、包含的角色、浅克隆与深克隆的实现,以及克隆对单例模式的影响和相应的解决办法。
二、原型模式的定义
原型模式是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。调用者不需要知道任何创建细节,不调用构造函数。
三、原型模式的角色
- 抽象原型类:规定了具体原型对象必须实现的
clone()
方法。 - 具体原型类:实现抽象原型类的
clone()
方法,是可被复制的对象。 - 访问类:使用具体原型类中的
clone()
方法来复制新的对象。
四、简单的原型模式示例
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Cloneable {
private String name;
private String sex;
private Integer age;
/**
* 重写 clone 方法,实现对象的复制
* @return 复制后的对象
* @throws CloneNotSupportedException 若不支持克隆则抛出此异常
*/
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
/**
* 主函数,用于测试原型模式的基本用法
* @param args 命令行参数
* @throws Exception 可能抛出的异常
*/
public static void main(String[] args) throws Exception{
Student stu1 = new Student("小明", "男", 18);
// 通过克隆创建 stu2 对象
Student stu2 = (Student)stu1.clone();
stu2.setName("小红");
// 输出 stu1 的信息
System.out.println(stu1); // Student(name=小明, sex=男, age=18)
// 输出 stu2 的信息
System.out.println(stu2); // Student(name=小红, sex=男, age=18)
}
}
可以看到,把一个学生复制过来,只是改了姓名而已,其他属性完全一样没有改变。需要注意的是,一定要在被拷贝的对象上实现 Cloneable
接口,否则会抛出 CloneNotSupportedException
异常。
四、浅克隆
浅克隆的定义:浅克隆创建一个新对象,新对象的属性和原来对象完全相同,但对于非基本类型属性,仍指向原有属性所指向的对象的内