日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

完成Prototype設(shè)計模式

完成Prototype設(shè)計模式

更新時間:2022-04-27 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

實現(xiàn)Prototype設(shè)計模式

Implementing the Prototype design Pattern



當(dāng)我建立一個類的實例很復(fù)雜時,我們可以使用Prototype模式。與其建立很多類的實例,還不如進(jìn)行適當(dāng)?shù)男薷暮螅褂米畛醯膶嵗母北尽J褂肞rototype模式,可以通過克隆一個原型,減少子類的數(shù)量。Prototype模式可以減少類的實例的數(shù)量。

在這個模式中,通過克隆來創(chuàng)建對象。我們有時創(chuàng)建很多的子類,除了通過很多的子類來創(chuàng)建不同的對象,我們還可以只需要唯一的一個子類,這個子類保持對每個對象基類的引用,并通過這個子類創(chuàng)建對象。通過向子類的構(gòu)造函數(shù)傳遞參數(shù)并克隆對象。每個對象都實現(xiàn)clone方法,所以可以被克隆。我們可以使用Prototype模式,通過克隆原型來減少子類的數(shù)量。

克隆可以通過實現(xiàn)Icloneable接口來實現(xiàn)。Icloneable接口中唯一的方法是Clone,并返回一個新的類的實例。

ICloneable.Clone method signature
[VisualBasic] Function Clone() As Object
[C#] object Clone();




我們必須了解Clone()方法只是一種淺表復(fù)制(Shallow copy),而不是深層復(fù)制(Deep copy)。所以它只是返回一個引用,而不象深層復(fù)制(Deep copy)那樣創(chuàng)建一個復(fù)制的實例。我們可以通過使用Iserializable接口來實現(xiàn)深層復(fù)制(Deep copy)。

另一個缺點就是原型的每個子類必須實現(xiàn)Clone()方法,有時候,增加clone方法是很困難的。

在這個例子中,我建立了EmpData類,并且實現(xiàn)了Icloneable接口和Iserializable接口。Icloneable接口需要實現(xiàn)Clone方法,使得類可以被復(fù)制。Iserializable接口為了實現(xiàn)對EmpData類的深層復(fù)制(Deep copy)。使用的方法為:將EmpData對象序列化為一個文件,也可以將這個文件反序列化為一個EmpData對象。

EmpData類包含兩個方法:GetEmpData和ChangeEmpData。這兩個方法被用來以一個字符串(string)的形式獲取EmpData對象、更改EmpData類。每個方法都可以被調(diào)用,來檢驗淺表復(fù)制(Shallow copy)和深層復(fù)制(Deep copy)的不同。淺表復(fù)制(Shallow copy)時,如果EmpData類改變時,這個變化也會同時出現(xiàn)在EmpData的克隆對象中;而在深層復(fù)制(Deep copy),如果EmpData對象發(fā)生改變時,這個變化不會出現(xiàn)在EmpData的克隆對象中。

EmpData類的構(gòu)造函數(shù)讀取XML文件并創(chuàng)建Emp對象。

XML 文件




VB.Net 實現(xiàn)



Imports System.Xml

Imports System.IO

Imports System.Collections

Imports System.Runtime.Serialization

Imports System.Runtime.Serialization.Formatters.Binary

<Serializable()> Public Class CEmpData

Implements ICloneable, ISerializable

Private ArrEmp As ArrayList

Public Sub New()

Dim xmldoc As New XmlDocument

Dim node As XmlNode

Dim objEmp As CEmp

ArrEmp = New ArrayList

xmldoc.Load("empdata.xml")

For Each node In xmldoc.DocumentElement.ChildNodes

objEmp = New CEmp

objEmp.FName = node.SelectSingleNode("firstname").InnerText

objEmp.LName = node.SelectSingleNode("lastname").InnerText

ArrEmp.Add(objEmp)

Next

End Sub

Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)

Dim intIndex As Integer

Dim intCount As Integer

Dim objEmp As CEmp

ArrEmp = New ArrayList

intCount = CInt(info.GetValue("emp_count", GetType(String)))

For intIndex = 0 To intCount - 1

objEmp = New CEmp(info, context, intIndex)

ArrEmp.Add(objEmp)

Next

End Sub

Public Function Clone() As Object Implements ICloneable.Clone

Try

Return Me

Catch ex As Exception

MsgBox(ex.ToString)

End Try

End Function

Public Function Clone(ByVal Deep As Boolean) As Object

Try

If Deep Then

Return CreateDeepCopy()

Else

Return Clone()

End If

Catch ex As Exception

MsgBox(ex.ToString)

End Try

End Function

Private Function CreateDeepCopy() As CEmpData

Dim objEmpCopy As CEmpData

Dim objStream As Stream

Dim objBinFormatter As New BinaryFormatter

Try

objStream = File.Open("Empdata.bin", FileMode.Create)

objBinFormatter.Serialize(objStream, Me)

objStream.Close()

objStream = File.Open("Empdata.bin", FileMode.Open)

objEmpCopy = CType(objBinFormatter.Deserialize(objStream), CEmpData)

objStream.Close()

CreateDeepCopy = objEmpCopy

Catch ex As Exception

MsgBox(ex.ToString)

End Try

End Function

Public Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData

Dim intIndex As Integer

Dim objEmp As CEmp

info.AddValue("emp_count", ArrEmp.Count)

For intIndex = 0 To ArrEmp.Count - 1

objEmp = ArrEmp(intIndex)

objEmp.GetObjectData(info, context, intIndex)

Next

End Sub

Public Function GetEmpData() As String

Dim intCount As Integer

Dim strEmpData As String

For intCount = 0 To ArrEmp.Count - 1

strEmpData = strEmpData & CType(ArrEmp(intCount), CEmp).FName & Chr(9) & CType(ArrEmp(intCount), CEmp).LName & Chr(13)

Next

GetEmpData = strEmpData

End Function

Public Sub ChangeEmpData()

Dim objEmp As CEmp

For Each objEmp In ArrEmp

objEmp.FName = "FirstName"

objEmp.LName = "LastName"

Next

End Sub

End Class

Public Class CEmp

Private mstrFName As String

Private mstrLName As String

Public Property FName() As String

Get

FName = mstrFName

End Get

Set(ByVal Value As String)

mstrFName = Value

End Set

End Property

Public Property LName() As String

Get

LName = mstrLName

End Get

Set(ByVal Value As String)

mstrLName = Value

End Set

End Property

Public Sub New()

End Sub

Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext, ByVal intIndex As Integer)

mstrFName = CStr(info.GetValue("emp_fname" & intIndex, GetType(String)))

mstrLName = CStr(info.GetValue("emp_lname" & intIndex, GetType(String)))

End Sub

Public Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext, ByVal intIndex As Long)

info.AddValue("emp_fname" & intIndex, mstrFName)

info.AddValue("emp_lname" & intIndex, mstrLName)

End Sub

End Class

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 久久久青青久久国产精品 | 日韩网站免费 | 高清中文字幕免费观在线 | 国产一区小可爱原卡哇伊 | 野外性xxxxfreexxxxx免费 | 日日摸夜夜添夜夜添欧美毛片 | 天天做天天操 | 韩国xxxx免费观看视频 | 麻豆国产福利91在线 | videossexo极品欧美| 天堂a免费视频在线观看 | 成人黄色在线视频 | 天天摸天天操天天爽 | 欧美日韩高清在线观看 | 久久久久国产亚洲日本 | 国产精品免费拍拍拍 | 亚洲欧美日韩中文字幕在线不卡 | 久久精品久久精品久久精品 | 福利社在线视频 | 国产欧美日韩三级 | 国产福利一区二区三区视频在线 | 日本三级香港三级网站 | 免费高清不卡毛片在线看 | 天天躁日日躁狠狠躁中文字幕老牛 | 欧美日韩中文在线 | 国产一级www在线视频 | 狠狠躁夜夜躁人人爽天天不 | 无翼乌邪恶彩色无摭挡之狂三 | 一区二区三区视频在线观看 | 99热热久久这里只有精品166 | 中国一级特黄 | 久久精品免费i 国产 | 免费一区二区三区在线视频 | 天天插夜夜 | 91国语精品自产拍在线观看性色 | 日本美女一区二区 | 福利网址大全 | 久久精品福利视频在线观看 | 天天做天天爱夜夜大爽完整 | 国产 欧美日韩 在线播放 | 精品免费久久久久久成人影院 |