轉殖羊多莉版原型模式

2021-10-10 02:32:04 字數 2394 閱讀 8003

寫在前面

光陰似箭日月如梭,轉瞬間大學生活就要告一段落了,在學習原型模式的時候,下意識的想到高中老師講轉殖羊多莉,二者產生了交集,相對而言,原型模式還是比較好理解的,廢話不多說,多莉登場!

轉殖羊-多莉

總所周知,多莉是乙個轉殖體,也就是在原來的羊的基礎上,通過科學的一些技術轉殖出了乙隻新的羊(現在是兩隻羊了)。我們知道單例模式,也就是,每乙個get的物件都是同乙個,不恰當的理解就是,大家公用乙個物件(這裡的物件是指new出來的物件,不是那個物件)。而原型模式就恰恰與單例模式相反了,原型模式可以片面的理解為是一夫一妻制。也就是你get的物件,跟我get的物件不是同乙個。既然如此,你需要乙個user物件,我也需要乙個,每次都去new,從造價上考慮是不是有點費了,是的,所以可以通過轉殖,當我們有了乙個物件之後,其他物件直接通過jdk提供的clone方法進行轉殖就可以了,需要注意的是,轉殖有深轉殖和淺轉殖之分,下面我們先轉殖一波看看。

轉殖首先我們需要建立乙個user類,這個類實現cloneable介面,並重寫clone方法,這樣一來,該類就具備了clone的功能了

public class user implements cloneable

// 省略get set

}

然後我們進行clone,生成乙個cloneuser,可以看到,二者的hashcode值不同,即二者不是同乙個物件。

user user = new user();

user.setname("一號種子");

date date = new date();

user.setdate(date);

user cloneuser = (user) user.clone();

system.out.println(user.hashcode());// 460141958

system.out.println(cloneuser.hashcode());// 1163157884

何為淺轉殖接著上面的例子說,我們轉殖出來了乙個物件,但是當我們對原物件進行了修改,那新新物件會變嗎?(先說答案,會變的就是淺轉殖)

我們對date進行修改,我們會發現,cloneuser的date也被修改了

user user = new user();

user.setname("一號種子");

date date = new date();

user.setdate(date);

user cloneuser = (user) user.clone();

date.settime(12345);

user.setdate(date);

system.out.println(user.getdate()); //thu jan 01 08:00:12 cst 1970

system.out.println(cloneuser.getdate());// thu jan 01 08:00:12 cst 1970

其實這是因為這兩個物件同時指向了date這個引用,所以當date進行修改的時候,這兩個物件都進行了修改,顯然這不是我們想要的。

深轉殖

深轉殖就是,對應用型別也進行乙份轉殖,此時我們需要重寫clone方法

@override

protected object clone() throws clonenotsupportedexception

這樣一來,再次執行上面的**,date就不會被修改了

user cloneuser = (user) user.clone();

date.settime(12345);

user.setdate(date);

system.out.println(user.getdate());// thu jan 01 08:00:12 cst 1970

system.out.println(cloneuser.getdate());// fri oct 30 09:27:37 cst 2020

總結

所謂原型模式,也就是,每個人get的物件都不是同乙個,這樣一來在併發的時候,單例模式可能出現問題,此時原型模式便是很好的解決方案(因為每個執行緒都是用自己的資源)

原型模式(轉殖模式)

轉殖模式最突出的優點就是,不用建立新的物件,省時間,效率高。適合需要一下子新建很多類的情況 轉殖模式分為兩種,淺轉殖和深轉殖 實現 cloneable可以實現轉殖 淺轉殖就是不能轉殖物件屬性,兩者公用乙個物件屬性位址 字串比較特殊,是不可改變物件,所以可以不看做物件 public class she...

七 原型模式(深淺轉殖)

類似 影之分身術 的東西,以 鳴人 為原型,複製1000份出來,群毆之 在初始化資訊不發生變化的情況下,轉殖是最好的辦法。既隱藏了物件建立的細節,又對效能大大的提高 不用重新初始化物件,而是動態地獲得物件執行時的狀態。摘自 大話設計模式 提到原型模式,就不得不提深淺轉殖。兩者都是完成對原型的複製,而...

原型模式(物件的轉殖)

原型模式 屬於物件的建立模式 通過給出乙個原型物件 來指明所有建立的物件的型別 然後用這個原型物件 提供的複製辦法 建立出更多同型別 的物件。聯想到瀏覽器中,如果我們生成了乙個button例項,這個button例項經過一系列操作,攜帶了各種資訊,比如button加顏色,加背景圖,加文字,加事件等等。...