現在有乙隻羊 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類圖:
原理結構圖說明:2.3 應用(淺拷貝)1)prototype : 原型類,宣告乙個轉殖自己的介面
2)concreteprototype: 具體的原型類, 實現乙個轉殖自己的操作
3)client: 讓乙個原型物件轉殖自己,從而建立乙個新的物件(屬性一樣)
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出來的新物件,基本資料型別的屬性變數是新建立...