(十九)設計模式-原型模式

1、定義

(Prototype)用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。

2、使用場景

簡歷的複印,拷貝所有簡歷上的內容,複印到其他A4紙上。

3、代碼結構UML圖

在這裏插入圖片描述
簡歷:具體原型類,實現一個克隆自身的操作;
工作經歷:一個普通的類,爲了實現深複製,實現ICloneable接口。

4、類的實現

(1)、Resume(簡歷類)
public class Resume implements Cloneable {
    private String name;
    private String sex;
    private String age;
    private WorkExperience work;

    public Resume(String name) {
        this.name = name;
        work = new WorkExperience();
    }

    private Resume(WorkExperience work) throws CloneNotSupportedException {
        this.work = (WorkExperience) work.clone();//深複製
//        this.work = work;//淺複製
    }

    public void setPersonInfo(String sex, String age) {
        this.sex = sex;
        this.age = age;
    }

    public void setWorkExperience(String workDate, String company) {
        this.work.setWorkDate(workDate);
        this.work.setCompany(company);
    }

    public void display() {
        System.out.println(name + " " + sex + " " + age);
        System.out.println(work.getWorkDate() + " " + work.getCompany());
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Resume resume = new Resume(this.work);
        resume.name = this.name;
        resume.sex = this.sex;
        resume.age = this.age;
        return resume;
    }
}
(2)、WorkExperience (工作經歷類)
public class WorkExperience implements Cloneable{
    private String workDate;
    private String company;

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getWorkDate() {
        return workDate;
    }

    public void setWorkDate(String workDate) {
        this.workDate = workDate;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

5、客戶端調用

public static void main(String[] args) {
        Resume a = new Resume("小明");
        a.setPersonInfo("男","29");
        a.setWorkExperience("1998-2000","XX公司");

        Resume b = null;
        try {
            b = (Resume) a.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        b.setWorkExperience("1998-2006","YY公司");

        Resume c= null;
        try {
            c = (Resume) a.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        c.setWorkExperience("1998-2003","ZZ企業");

        a.display();
        b.display();
        c.display();
    }
輸出:

在這裏插入圖片描述

6、總結

實現深複製時需要在對應類的引用對象實現clone方法;
淺複製:被複制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象。
深複製:把引用對象的變量指向複製過的新對象,而不是原有的被引用的對象。使用場景多。
原型模式其實就是從一個對象再創建另外一個可定製的對象,而且不需知道任何創建的細節。
集成ICloneable接口,實現clone發放就可以完成原型模式。
一般在初始化的信息不發生變化的情況下 ,克隆是最好的辦法。這既隱藏了對象創建的細節,又對性能是大大的提高。
不要重新初始化對象,而是動態地獲得對象運行時的狀態。


參考:《大話設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章