原型模式
简介
定义
原型模式时创建型模式,其用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。
好处
- 用这种方式创建对象非常高效,根本无须知道对象创建的细节。
- Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。
- 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。
缺点
需要为每一个类都配置一个 clone 方法,由于clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。
实例
1、创建一个实现了 Cloneable 接口的抽象类
package PrototypePattern;
public class Item implements Cloneable{
public String name;
public String info;
public String time;
public Item(String name,String info,String time){
this.info=info;
this.name=name;
this.time=time;
System.out.println("创建对象成功");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void display(){
System.out.println(name+info+time);
}
public Object clone() throws CloneNotSupportedException{
System.out.println("拷贝成功");
return (Item)super.clone();
}
}
2、在demo中试验
package PrototypePattern;
public class demo {
public static void main(String[] args) throws CloneNotSupportedException{
Item item1=new Item("皮卡丘"," 等级:5"," 捕捉于1号道路");
item1.display();
Item item2=(Item) item1.clone();
item2.display();
Item item3=(Item) item1.clone();
item3.setName("杰尼龟");
item3.display();
}
}
抛开其他条件
首先假如我们在1号道路抓到一只皮卡丘(创建一个皮卡丘对象)
我们又抓到一直一模一样的皮卡丘,就可以运用clone复制一个一样的皮卡丘(clone)
同一地点抓到的除了种类不一样其他都一样的宝可梦时可以先复制一个对象再简单修改就好了。
结果
总结
注意:Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类。
原型模式通常适用于以下场景
- 对象之间相同或相似,即只是个别的几个属性不同的时候。
- 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
- 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
- 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。
关注博主,一起来学习设计模式吧