Java23种设计模式之原型模式
原型模式
定义:原型模式属于对象创建模式。用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。用原型模式创建的实例,具有与原型一样的数据。Prototype 模式主要是通过Java的Object类提供的clone() 方法实现对象复制的。
我觉得西游记的孙大圣得分身就很好得诠释了原型:
原型模式的结构
- 客户角色:由原型对象本身创建新对象;
- 抽象原型角色:规定了原型对象复制必须实现的clone()方法;
- 具体原型角色:为抽象原型角色的子类,实现了其clone()方法,是可以被复制的对象;
优缺点
优点:
- 性能提高。减少内存消耗,节约资源,其所有的实例都是共享的同一个,不会创建多个。
- 逃避构造函数的约束。原型对象继承时直接是重写其父类方法,扩展方便。
缺点:
- 因所有的实例共享同一个对象,有可能会相互影响
- 需要为每一个类都配置一个 clone 方法
克隆分为浅克隆和深克隆
- 浅克隆:拷贝对象和原始对象的引用类型引用同一个对象。浅克隆只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅克隆。
- 深克隆:拷贝对象和原始对象的引用类型引用不同对象。深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝
(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)。
原型模式通用实现
抽象原型角色
/**
* @Description: 抽象原型角色
* @Author: 亦辰
* @CreateTime: 2023-05-17
*/
public abstract class Prototype {
public abstract Prototype clone();
}
具体原型角色
/**
* @Description: 具体原型角色
* @Author: 亦辰
* @CreateTime: 2023-05-17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConcretePrototype2 extends Prototype {
private String name;
public void showInfo() {
System.out.println(this.name + " 地球村华夏第一学院");
}
@Override
public ConcretePrototype2 clone() {
ConcretePrototype2 prototype = new ConcretePrototype2();
prototype.setName(this.name);
return prototype;
}
}
测试
/**
* @Description: 测试
* @Author: 亦辰
* @CreateTime: 2023-05-17
*/
public class ClientTest {
public