2023年7月5日,英國科學家伊恩·威爾穆特博士成功的轉殖出了乙隻小羊,小羊與它的「母親」一模一樣。這只小羊的名字就是dolly。
dolly是由……
不要認為介紹多莉轉殖的故事和本文牛頭不對馬嘴,事實上多少還是有點關係的。
1.什麼是原型模式?
原型模式就是用來建立重複的物件,再直白一點:複製貼上的原理。
怎麼樣?是不是和轉殖羊是不是還能扯上關係?
現在假如有個物件的建立過程及其複雜,可能需要**一萬行(此處使用了誇張的手法……),那如果你需要再建立乙個這樣的物件,是不是還需要來一萬行**?
為了解決這種問題,出現了原型模式,也就是有乙個物件作為模板,再複製出乙個新的物件。
2.如何使用原型模式?
案例:就拿正版書和盜版書為例:
1)定義正版書類
注意:原型類需要實現cloneable
介面。
/**
* 定義原型類(正版書)
*/public
class
book
implements
cloneable
/** * 重寫to string方法
*/@override
public string tostring()
';}/**
* 重寫構造方法
*/public
book
(string name, string author, date date)
}/**
* set方法
*/public
void
setname
(string name)
public
void
setauthor
(string author)
public
void
setdate
(date date)
2)定義測試類
/**
* 定義測試類
*/public
class
test
}
3)測試結果
原型模式到這裡你以為就over
了?不知道你有沒有發現:如果book
物件的某個引數一變,則piracybook
物件的引數也會隨之改變,這種clone
我們稱之為
淺轉殖
既然有淺轉殖
,那肯定也有深轉殖
嘛。那到底什麼是深轉殖?
拿上面的案例來說,當我們的正版書的某個引數改變了之後,讓以他為原型轉殖的其他盜版書的引數依然保持第一次轉殖時候的值。(比如:上面的正版書的author
引數的值變為李四了,但是盜版書的author
依然保持為張三,這就是深轉殖)。
3.如何實現深轉殖?
我們可以通過序列化和反序列化
或者是通過重寫clone()方法
來進行深轉殖。
3.1重寫clone()方法
1)修改clone()方法
在上面案例中的第一步:定義正版書(book)類
的時候,對clone()
方法進行改寫。
/**
* 重寫clone方法(ctrl+o) 二:深轉殖
*/@override
protected object clone()
throws clonenotsupportedexception
2)重新跑一下測試類
我們發現,兩個物件依然不是同乙個物件,當date
引數的值被改變之後,也只是book
正版書物件的date
值變了,而piracybook
的值卻依然保持第一次複製出來的值。
3.2 序列化和反序列化
1)book類實現serializable介面
2)修改測試類
public
class
test
}
3)測試結果
所以使用序列化和反序列化需要使用io流
互動,操作起來比較麻煩,如果需要使用深轉殖
,我們一般會選擇使用重寫clone()方法
的方式來實現
4.淺轉殖和深轉殖的區別?
1)淺轉殖:
對值型別的成員變數進行值的複製,對引用型別的成員變數只複製引用,不複製引用的物件。
2)深轉殖:
對值型別的成員變數進行值的複製,對引用型別的成員變數也進行引用物件的複製。
至此,23中設計模式中的第一種型別:建立型模式
就寫完了,下面寫第二種型別:結構型模式
設計模式 6 原型模式
有時需要生成多個相同的物件,最普通的方法就是就是用相同的屬性new相同的物件 public class main class chicken 這樣做的缺點是,如果需要修改乙個屬性,其他物件的屬性就要跟著改一遍,有乙個便捷的方法,就是採用 原型模式,從乙個物件再建立另外乙個可定製的物件,不需要知道任何...
C 設計模式(6) 原型模式
在軟體系統開發中,有時候會遇到這樣的情況 我們需要用到多個相同例項,最簡單直接的方法是通過多次呼叫new方法來建立相同的例項。如下 person person new person person person2 new person person person3 new person 但是有乙個問題...
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...