1. 程式人生 > >淺談Java設計模式——原型模式(Prototype)

淺談Java設計模式——原型模式(Prototype)

一、概述

        用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

二、使用場景

1.當一個系統應該獨立於它的產品建立、構成和表示時。

2.當要例項化的類是在執行時刻指定時,例如,通過動態裝載。 

3.為了避免建立一個與產品類層次平行的工廠類層次時。 

4.當一個類的例項只能有幾個不同狀態組合中的一種時。 

        在我們應用程式可能有某些物件的結構比較複雜,但是我們又需要頻繁的使用它們,如果這個時候我們來不斷的新建這個物件勢必會大大損耗系統記憶體的,這個時候我們需要使用原型模式來對這個結構複雜又要頻繁使用的物件進行克隆。所以原型模式就是用原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件。它主要應用與那些建立新物件的成本過大時。它的主要優點就是簡化了新物件的建立過程,提高了效率,同時原型模式提供了簡化的建立結構。建立相應數目的原型並克隆它們可能比每次用合適的狀態手工例項化該類更方便一些。

三、參與者

1. Prototype 宣告一個克隆自身的介面、實現一個克隆自身的操作。 

2. Client 讓一個原型克隆自身從而建立一個新的物件。

四、類圖

五、程式碼示例

 1.Prototype

/**
 * @author zhipeng_Tong
 */
public class WorkExperience implements Cloneable{
    private String date;
    private String address;

    public WorkExperience(String date, String address) {
        this.date = date;
        this.address = address;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

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

    @Override
    public String toString() {
        return "WorkExperience{" +
                "date='" + date + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
/**
 * @author zhipeng_Tong
 */
public class Resume implements Cloneable{
    private String name;
    private int age;
    private WorkExperience workExperience;

    public Resume() {
    }

    public Resume(String name, int age, WorkExperience workExperience) {
        this.name = name;
        this.age = age;
        this.workExperience = workExperience;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Resume resume = null;

        return super.clone();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public WorkExperience getWorkExperience() {
        return workExperience;
    }

    public void setWorkExperience(WorkExperience workExperience) {
        this.workExperience = workExperience;
    }

    @Override
    public String toString() {
        return "Resume{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", " + "\n\t" + "workExperience=" + workExperience +
                '}';
    }
}

2.Client

public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        Resume resume = new Resume("佟志鵬", 23,
                new WorkExperience("2019", "al"));
        System.out.println(resume);

        System.out.println("-------------------------");
        Resume clone = (Resume)resume.clone();
        clone.setName("小明");
        clone.setAge(12);
        clone.setWorkExperience(new WorkExperience("2022", "ccut"));
        System.out.println(clone);
    }
}

Resume{name='路人甲', age=23,      workExperience=WorkExperience{date='2019', address='al'}} ------------------------- Resume{name='小明', age=12,      workExperience=WorkExperience{date='2022', address='ccut'}}