什么是原型模式
(Prototype) 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
用于创建重复的对象,同时又能保证性能。
- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
- java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点
克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。
需要注意: 使用Object中的clone()方法拷贝对象的时候,对于对象内部的数组、引用对象等都不拷贝,还是指向被拷贝对象中引用所在的地址,这种拷贝叫做浅拷贝。对于非基本数据类型的数据如list,map等拷贝则需要深拷贝,所谓深拷贝就是对于那些只是拷贝引用而不拷贝对象的属性进行单独拷贝
模式角色
1.原型类(Sheep克隆羊):原型类,声明一个克隆自己的接口
2.具体原型类(ConcretePrototype1,ShaunTheSheep):实现一个克隆自身的操作
UML类图
image.png代码实现
public interface Sheep extends Cloneable {
public Sheep createClone();
}
public class ShaunTheSheep implements Sheep {
private String sheepName;
private String sheepColor;
@Override
public Sheep createClone() {
Sheep sheep = null;
try {
sheep = (Sheep)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return sheep;
}
public String getSheepName() {
return sheepName;
}
public void setSheepName(String sheepName) {
this.sheepName = sheepName;
}
public String getSheepColor() {
return sheepColor;
}
public void setSheepColor(String sheepColor) {
this.sheepColor = sheepColor;
}
public ShaunTheSheep(String sheepName,
String sheepColor) {
this.sheepName = sheepName;
this.sheepColor = sheepColor;
}
@Override
public String toString() {
return "ShaunTheSheep{" +
"sheepName='" + sheepName + '\'' +
", sheepColor='" + sheepColor + '\'' +
'}';
}
}
public class Client {
public static void main(String[] args) {
Sheep sheep = new ShaunTheSheep("小羊肖恩", "黑色");
Sheep sheepClone = sheep.createClone();
System.out.println(sheepClone); //ShaunTheSheep{sheepName='小羊肖恩', sheepColor='黑色'}
System.out.println(sheep); //ShaunTheSheep{sheepName='小羊肖恩', sheepColor='黑色'}
}
}
优点
一般在初始化的信息不发生变化的情况下,克隆是最好的办法,即隐藏了对象创建的细节,又对性能是大大的提供。
缺点
深拷贝和浅拷贝的使用需要事先考虑周到。否则很容易出现错误。
网友评论