設計模式——原型模式

原型模式

介紹

原型模式:使用原型實例指定創建對象的種類,通過拷貝原型創建新的對象。需要注意的是,通過克隆產生的新的對象與原對象之間沒什麼關聯,二者之間擁有不同的地址。創建克隆對象的工廠就是原型本身,工廠方法由克隆方法來實現。

角色

  • 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()));
    }
}

源代碼請參考 PrototypePattern

發佈了75 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章