原型设计模式prototype
定义:
用一个已经创建的实例作为原型,通过复制该圆形对象来创建一个和原型相同或相似的对象。(类似于复制?
- 原型模式的优点:
- Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。
- 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。
- 缺点:
- 需要为每个类配置一个clone方法
- clone方法在类的内部,当需要修改代码时,违反了OCP原则
原型模型的结构和实现
1.模式结构
抽象原型类:规定具体原型对象必须实现的接口
具体原型类:实现抽象原型类的clone方法
访问类:使用具体原型类中的clone方法来复制新对象
2. 模式的实现
克隆分为:深克隆、浅克隆
- 深克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
- 浅克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
example1
class Realizetype implements Cloneable{
Realizetype() {
System.out.println("具体原型创建成功");
}
@Override
public Object clone() throws CloneNotSupportedException{
System.out.println("具体原型复制成功");
return (Realizetype) super.clone();
}
}
public class PrototypeTest{
public static void main(String[] args) throws CloneNotSupportedException {
Realizetype ob1=new Realizetype();
Realizetype ob2=(Realizetype) ob1.clone();
System.out.println("obj1==ob2? "+(ob1==ob2));
}
}
example2
/**
* @author richard
* @date 2021年11月23日 13:45:00
* @description
*/
class MonkeyKing implements Cloneable{
private static final long ID=234543253;
int age;
String city;
String name;
public MonkeyKing(int age, String city,String name) {
this.age = age;
this.city = city;
this.name=name;
System.out.println("孙悟空具体原型创建成功");
}
public void setAge(int age) {
this.age = age;
}
public void setCity(String city) {
this.city = city;
}
public void setName(String name) {
this.name = name;
}
public void display(){
System.out.println(name+age+city);
}
@Override
protected Object clone() throws CloneNotSupportedException {
MonkeyKing mk=null;
mk= (MonkeyKing) super.clone();
System.out.println("复制成功");
return mk;
}
}
public class MonkeyKingTest{
public static void main(String[] args) {
MonkeyKing swk=new MonkeyKing(133,"beijing","孙悟空");
swk.display();
try {
MonkeyKing copySwk=(MonkeyKing) swk.clone();
//copySwk.setAge(1);
//copySwk.setCity("西安");
//如果没有给年龄和城市赋值,则copy对象的属性和原型的保持一致
copySwk.setName("一号");
copySwk.display();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
应用场景
- 对象之间相同或者相似,只有个别属性不同
- 创建对象成本比较大,如初始化时间比较长,占用较多cpu等
- 系统大量使用该类的对象,并且每个调用者都要给他的属性重新赋值