• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        完成Prototype設計模式

        完成Prototype設計模式

        更新時間:2022-04-27 文章作者:未知 信息來源:網絡 閱讀次數:

        實現Prototype設計模式

        Implementing the Prototype design Pattern



        當我建立一個類的實例很復雜時,我們可以使用Prototype模式。與其建立很多類的實例,還不如進行適當的修改后,使用最初的實例的副本。使用Prototype模式,可以通過克隆一個原型,減少子類的數量。Prototype模式可以減少類的實例的數量。

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

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

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




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

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

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

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

        EmpData類的構造函數讀取XML文件并創建Emp對象。

        XML 文件




        VB.Net 實現



        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

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

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 亚洲AV成人精品日韩一区18p| 成人A级毛片免费观看AV网站| 亚洲精品国产成人影院| 色噜噜噜噜亚洲第一| 国产一区二区免费在线| 特级毛片A级毛片100免费播放| 国产成人综合久久精品免费| 大片免费观看92在线视频线视频| 亚洲 自拍 另类小说综合图区| 日日摸夜夜添夜夜免费视频 | 亚洲av高清在线观看一区二区 | 青青草a免费线观a| 在线综合亚洲欧洲综合网站| 精品无码国产污污污免费| 羞羞视频免费观看| 亚洲男同帅GAY片在线观看| 久久精品免费电影| 亚洲欧洲日产韩国在线| 免费看美女让人桶尿口| 欧洲美女大片免费播放器视频| 久久久久亚洲av成人无码电影| 精品国产污污免费网站| 亚洲一区二区三区国产精品无码| 国产无遮挡吃胸膜奶免费看| 999zyz**站免费毛片| 亚洲人色大成年网站在线观看| 免费看又爽又黄禁片视频1000| a高清免费毛片久久| 久久精品九九亚洲精品| 狠狠久久永久免费观看| 岛国岛国免费V片在线观看| 亚洲第一永久在线观看| 波多野结衣中文一区二区免费 | 亚洲gv白嫩小受在线观看| 最近免费中文字幕视频高清在线看| 黄色免费在线网址| 中文字幕亚洲综合久久2| 午夜亚洲福利在线老司机| 18禁美女裸体免费网站| 黄色a级免费网站| 亚洲国产综合自在线另类|