java中的原型模式
- 自带 -> Object.clone()
- 实现原型模式需要实现标记型接口Cloneable
- 一般会重写clone()方法
- 一般用于一个对象的属性已经确定, 需要产生很多相同对象的时候
- 或者一个对象的属性过多, 可以省去大量setXXX的代码
- 需要区分深克隆与浅克隆
对于属性过多的对象, 也可以考虑用builder模式, 原型模式用的不多
浅克隆
只在Person类中加一个clone方法, 不在Location中加clone方法
改了p1对象的某个属性, 发现p2的这个属性也被改了
虽然p1和p2不是同一个地址的对象, 但是他们的属性引用的是同一个对象
public class Test {
public static void main(String[] args) throws Exception {
Person p1 = new Person();
Person p2 = (Person) p1.clone();
System.out.println(p2.age + " " + p2.score);
System.out.println(p2.loc);
System.out.println(p1.loc == p2.loc);
p1.loc.street = "sh";
System.out.println(p2.loc);
}
}
class Person implements Cloneable {
int age = 8;
int score = 100;
Location loc = new Location("bj", 22);
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Location {
String street;
int roomNo;
@Override
public String toString() {
return "Location{ street='" + street + '\'' + ", roomNo=" + roomNo + '}';
}
public Location(String street, int roomNo) {