設計模式之原型模式

2022-09-06 08:03:10 字數 4071 閱讀 8295

現在有乙隻羊 tom,姓名為: tom, 年齡為:1,顏色為:白色,請編寫程式建立和 tom 羊 屬性完全相同的 10隻羊。

1.1 思路分析:

1.2 傳統應用

sheep.j**a

public class sheep 

}

client.j**a

public class client 

}

1.3 傳統方式優缺點:

1)優點是比較好理解,簡單易操作。

2)在建立新的物件時,總是需要重新獲取原始物件的屬性,如果建立的物件比較複雜時,效率較低

3)總是需要重新初始化物件,而不是動態地獲得物件執行時的狀態, 不夠靈活

4)改進的思路分析

思路:j**a 中 object 類是所有類的根類,object 類提供了乙個 clone()方法,該方法可以將乙個 j**a 物件複製乙份,但是需要實現 clone 的 j**a 類必須要實現乙個介面 cloneable,該介面表示該類能夠複製且具有複製的能力 => 原型模式

2.1 基本介紹:

1)原型模式(prototype 模式)是指:用原型例項指定建立物件的種類,並且通過拷貝這些原型,建立新的物件

2)原型模式是一種建立型設計模式,允許乙個物件再建立另外乙個可定製的物件,無需知道如何建立的細節

3)工作原理是:通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝它們自己來實施建立,即 物件.clone()

4)形象的理解:孫大聖拔出猴毛, 變出其它孫大聖

2.2 uml類圖:

原理結構圖說明:

1)prototype : 原型類,宣告乙個轉殖自己的介面

2)concreteprototype: 具體的原型類, 實現乙個轉殖自己的操作

3)client: 讓乙個原型物件轉殖自己,從而建立乙個新的物件(屬性一樣)

2.3 應用(淺拷貝)

sheep.j**a

//實現cloneable介面

public class sheep implements cloneable

//轉殖該例項,使用預設的clone方法來完成

@override

protected object clone() catch (exception e)

return sheep;

}}

client.j**a

public class client 

}

3.1 淺拷貝介紹

1)對於資料型別是基本資料型別的成員變數,淺拷貝會直接進行值傳遞,也就是將該屬性值複製乙份給新的物件。

2)對於資料型別是引用資料型別的成員變數,比如說成員變數是某個陣列、某個類的物件等,那麼淺拷貝會進行引用傳遞,也就是只是將該成員變數的引用值(記憶體位址)複製乙份給新的物件。因為實際上兩個物件的該成員變數都指向同乙個例項。在這種情況下,在乙個物件中修改該成員變數會影響到另乙個物件的該成員變數值

3)前面我們轉殖羊就是淺拷貝

4)淺拷貝是使用預設的 clone()方法來實現

sheep = (sheep) super.clone();

3.2 深拷貝介紹

1)複製物件的所有基本資料型別的成員變數值

2)為所有引用資料型別的成員變數申請儲存空間,並複製每個引用資料型別成員變數所引用的物件,直到該物件可達的所有物件。也就是說,物件進行深拷貝要對整個物件(包括物件的引用型別)進行拷貝

3)深拷貝實現方式 1:重寫 clone 方法來實現深拷貝

3.3 應用

deepcloneabletarget.j**a

public class deepcloneabletarget implements serializable, cloneable 

//因為該類的屬性,都是string , 因此我們這裡使用預設的clone完成即可

@override

protected object clone() throws clonenotsupportedexception

}

deepprototype.j**a

public class deepprototype implements serializable, cloneable

//深拷貝 - 方式 1 使用clone 方法

@override

protected object clone() throws clonenotsupportedexception

//深拷貝 - 方式2 通過物件的序列化實現 (推薦)

public object deepclone() catch (exception e) finally catch (exception e2)

} }

}

client.j**a

public class client 

}

spring 中原型 bean 的建立,就是原型模式的應用

**分析+debug原始碼:

monster.j**a

public class monster 

}

beans.xml

<?xml version="1.0" encoding="utf-8"?>

prototype.j**a

public class prototype 

}

debug下的spring原始碼:
@override	//970行

public object getbean(string name) throws bean***ception

abstractbeanfactory.j**a

@override	//193行

public object getbean(string name) throws bean***ception

@suppresswarnings("unchecked") //232行

protected t dogetbean(final string name, final classrequiredtype, final object args, boolean typecheckonly)throws bean***ception

catch (bean***ception ex)

}});

bean = getobjectforbeaninstance(sharedinstance, name, beanname, mbd);

}else if (mbd.isprototype())

finally

bean = getobjectforbeaninstance(prototypeinstance, name, beanname, mbd);}}

1)建立新的物件比較複雜時,可以利用原型模式簡化物件的建立過程,同時也能夠提高效率

2)不用重新初始化物件,而是動態地獲得物件執行時的狀態

3)如果原始物件發生變化(增加或者減少屬性),其它轉殖物件的也會發生相應的變化,無需修改**

4)在實現深轉殖的時候可能需要比較複雜的**

5)缺點:需要為每乙個類配備乙個轉殖方法,這對全新的類來說不是很難,但對已有的類進行改造時,需要修改其源**,違背了 ocp 原則

設計模式之原型模式

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

設計模式之原型模式

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

設計模式之原型模式

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