設計模式之原型模式

2021-07-29 23:16:23 字數 2741 閱讀 5064

定義:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式屬於建立型模式,前面已經講了四個建立型模式,原型模式是最後乙個。通過定義描述,不難理解原型模式相當於複製物件,避免複雜物件的初始化過程。

從圖上看,原型模式非常簡單。只要具體類實現cloneable介面,覆蓋object類下都有的clone方法。clone方法是通過jni呼叫,虛擬機會呼叫已實現cloneable介面的類中的clone方法,所以clone方法必須覆蓋,不然會報錯。不需要我們知道原理,總之就是複製物件。

protected

native object clone() throws clonenotsupportedexception;

舉個汽車的例子。通常汽車都有發動機、輪胎、型別、顏色等等。同個型別的汽車配置大多都是一樣的,而也有些區別。比如白色賓士和黑色賓士,只是顏色不一樣。這時白色賓士作為參考,再新造黑色賓士,相當於複製一輛賓士,改變顏色。

**示例

public

class

carimplements

cloneable

public

void

settype(string type)

public string getcolor()

public

void

setcolor(string color)

protected object clone() catch (clonenotsupportedexception e)

return

null;}}

客戶端

car car1 = new car();

car1.settype("賓士");

car1.setcolor("白色");

system.out

.println(car1.getcolor()+car1.gettype()+car1.tostring());//輸出 白色賓士car@659e0bfd

car car2 = (car) car1.clone();

car2.setcolor("黑色");

system.out

.println(car2.getcolor()+car2.gettype()+car2.tostring());//輸出 黑色賓士car@15db9742

從**可以看到,car1拷貝car2,car2還帶有car1的屬性,而且兩個物件指向的不是同乙個記憶體位址,所以各自修改也不影響對方。這就是clone作用。

如果我新增乙個引擎類,作為car的屬性。引擎名字預設為default。

public

class

engine

public

void

setname(string name)

}public

class

carimplements

cloneable

}

客戶端

car car1 = new car();

system.out

.println(car1.getengine().getname() + car1.getengine().tostring());

car car2 = (car) car1.clone();

car2.getengine().setname("new");

system.out

.println(car2.getengine().getname() + car2.getengine().tostring());

system.out

.println(car1.getengine().getname() + car1.getengine().tostring());

輸出為:

defaultengine@659e0bfd

newengine@659e0bfd

newengine@659e0bfd

可以看出裡面的例項都是一樣的,引用位址是同一塊區域所以當car1的engine改變,car2的engine也跟著改變,這也不符合我們的使用原型初衷。這叫淺拷貝,只能拷貝基本型別不能拷貝物件。當然也有解決方案,有淺就有深,稱為深拷貝。做法是需要被拷貝物件實現cloneable介面,覆蓋clone方法。然後在拷貝的地方呼叫被拷貝物件的clone方法。

public

class

engine

implements

cloneable

}public

class

carimplements

cloneable catch (clonenotsupportedexception e)

return

null;}}

客戶端**不改,編譯執行,得出的是我們想要的結果。

總的來說,應用在建立多次重複物件時或者耗時的物件初始化,原型模式可以不受構造器的約束,減少初始化的開銷。只要被拷貝的物件實現cloneable介面並且覆蓋clone方法即可。原型模式分為淺拷貝和深拷貝,使用情況取決於內部例項是否重新指定新的記憶體區域。不足之處望指教。

設計模式之原型模式

原型模式其實就是從乙個物件再建立乙個可定製的物件,而且不需要知道建立的細節。具體就是說通過複製或者轉殖乙個原型物件產生新的物件 轉殖物件 分為兩種 深複製或者淺複製,這兩種的主要區別是 在原型中如果有物件的引用,淺複製是將引用複製過來了,也就是淺複製和原型中的物件的引用相同,而深複製是將轉殖物件中引...

設計模式之原型模式

include include 此練習為原型模式方法的練習 原型模式揭示了在同一原型上可以通過複製使得 只需要例項化一次,再通過相應的類函式操作可以得到 同一原型下的不同的版本物件 此練習將考慮在實際開發中 比如 工作經歷也是作為乙個類被含在簡歷類中的情況 這情況將涉及到類的引用和深 淺複製 原型基...

設計模式之原型模式

原型模式的思想就是將乙個物件作為原型,對其進行複製 轉殖,產生乙個和原物件類似的新物件 複製過程可分為淺複製和深複製。淺複製是指直接呼叫父類 即object類 的clone方法 super.clone 該方法是本地 native 方法,呼叫該方法clone出來的新物件,基本資料型別的屬性變數是新建立...