拷贝工厂

尽量不使用继承,使用聚合。

聚合:雁群与雁
组合:雁与翅膀

除了builder模式,还有一个有用的技巧:拷贝工厂

cloneable接口和clone方法依赖于整个对象继承树的健壮性,由于设计理念是链式调用父类的clone方法,维护难度过高,出错概率太大。

可行的方案之一是使用拷贝构造函数。

更推荐的方案是使用拷贝工厂,例如下文的:
public static ClassA newInstance(ClassA obj);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package test1;
import static java.lang.System.out;
public class ClassA {
public static void main(String[] args) {
ClassA a1=new ClassA("a1",1);
ClassA a2=ClassA.newInstance(a1);
a1.AInt=2;
a1.AString="changed";
a1.array[0]=100;
out.println(a1.AString);
out.println(a2.AString);
out.println(a1.AInt);
out.println(a2.AInt);
out.println(a1.array[0]);
out.println(a2.array[0]);
}
String AString;
int AInt;
int array[];
public ClassA(String aString,int aInt) {
this.AString=aString;
this.AInt=aInt;
array=new int[1];
array[0]=1;
}
private ClassA() {}
public static ClassA newInstance(ClassA obj) {
ClassA classA = new ClassA();
classA.AInt = obj.AInt;
classA.AString = obj.AString;// 并没有任何问题
classA.array = obj.array.clone();// 基本对象
//other deepcopy here
return classA;
}
}

推荐文章