【設計模式系列】原型模式

語言: CN / TW / HK

theme: cyanosis

這是我參與11月更文挑戰的第21天,活動詳情檢視:2021最後一次更文挑戰

我是小黑,一個在網際網路“苟且”的程式設計師。

流水不爭先,貴在滔滔不絕

前言

原型設計模式是建立型設計模式之一,主要用於提供一種建立物件的機制。

其他建立型設計模式擴充套件閱讀:

當一個物件的建立工廠很複雜,需要大量的時間和資源,每建立一次物件變得很昂貴,並且在已經有一個類似的物件時,就可以使用原型設計模式,來降低物件建立的成本,節約資源。

原型模式提供了一種機制,可以將原始物件複製到新物件中,然後根據需要對其進行修改。java中的原型設計模式使用clone()來複制物件。

場景

舉個例子可能更容易理解原型設計模式,比如我們有一個物件是從資料庫中加載出來的資源物件,現在需要在應用程式中多次對這個物件進行修改或使用。因此每次從資料庫中重新載入這個物件或者使用new關鍵字重新建立不是一個好的處理方式。

更好的方法是將現有物件克隆為新物件,然後進行資料操作。

原型設計模式要求要被複制的物件必須提供可複製的特性。而其他任何類的物件都不應該提供可被複制的特性。在克隆物件時,使用物件屬性的淺拷貝還是深拷貝取決於場景的需求和具體設計。

原型設計模式程式碼結構

下面是一個使用原型設計模式的程式碼示例:

```java package com.heiz.design.prototype;

import java.util.ArrayList; import java.util.List;

public class Employees implements Cloneable{

private List<String> empList;

public Employees(){
    empList = new ArrayList<String>();
}

public Employees(List<String> list){
    this.empList=list;
}
public void loadData(){
    //模擬從資料庫中載入資料
    empList.add("小黑說Java");
    empList.add("小黑說Python");
    empList.add("小黑說JavaScript");
    empList.add("小黑說PHP");
}

public List<String> getEmpList() {
    return empList;
}

// clone方法用於物件的複製
@Override
public Object clone() throws CloneNotSupportedException{
        List<String> temp = new ArrayList<String>();
        for(String s : this.getEmpList()){
            temp.add(s);
        }
        return new Employees(temp);
}

} ```

注意程式碼中的clone()方法,用於對Employees的深拷貝。

接下來我看使用一個簡單測試程式碼看看如何使用原型設計模式:

```java package com.heiz.design.test;

import java.util.List; import com.heiz.design.prototype.Employees;

public class PrototypePatternTest {

public static void main(String[] args) throws CloneNotSupportedException {
    Employees emps = new Employees();
    emps.loadData();
    //使用克隆方法克隆出新物件
    Employees empsNew = (Employees) emps.clone();
    Employees empsNew1 = (Employees) emps.clone();
    List<String> list = empsNew.getEmpList();
    list.add("小黑說HTML");
    List<String> list1 = empsNew1.getEmpList();
    list1.remove("小黑說Go");

    System.out.println("emps List: "+emps.getEmpList());
    System.out.println("empsNew List: "+list);
    System.out.println("empsNew1 List: "+list1);
}

}

```


以上就是原型設計模式的所有內容,如果對你有所幫助,點贊是對我最大的鼓勵!