原型模式
介紹
原型模式:使用原型實例指定創建對象的種類,通過拷貝原型創建新的對象。需要注意的是,通過克隆產生的新的對象與原對象之間沒什麼關聯,二者之間擁有不同的地址。創建克隆對象的工廠就是原型本身,工廠方法由克隆方法來實現。
角色
- Prototype(抽象原型類):聲明克隆方法的接口,是所有具體原型類的公共父類
- ConcretePrototype(具體原型類):實現在抽象原型中聲明的克隆方法,返回自己的一個克隆對象
- Client(客戶端)
Java中的原型模式實現
由於Java所有類都繼承自Object,而Object提供了clone()方法,因此在Java中可以把Object類當作抽象原型類,而把實現了Cloneable接口的類當作具體原型類,在具體原型類中覆蓋clone()方法即可。
示例代碼
//具體原型類
public class ConcretePrototype implements Cloneable {
private String name;
private int age;
private Integer[] array;
public ConcretePrototype(String name, Integer age, Integer[] array) {
this.name = name;
this.age = age;
this.array = array;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer[] getArray() {
return array;
}
public void setArray(Integer[] array) {
this.array = array;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public ConcretePrototype clone() {
Object o = null;
try {
o = super.clone();
o = (ConcretePrototype)o;
//深複製
((ConcretePrototype) o).setArray(this.array.clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return (ConcretePrototype)o;
}
}
public class Client {
public static void main(String[] args) {
ConcretePrototype c1 = new ConcretePrototype("c1", 10, new Integer[]{1,2,3});
ConcretePrototype c2 = c1.clone();
System.out.println(c1 == c2);
System.out.println(c1.getName() == c2.getName());
System.out.println(c1.getAge() == c2.getAge());
System.out.println(c1.getArray() == c2.getArray());
c1.setName("c");
c1.setAge(20);
c1.getArray()[0] = 0;
System.out.println(c2.getName());
System.out.println(c2.getAge());
System.out.println(Arrays.asList(c2.getArray()));
}
}