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

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

        完成Prototype設(shè)計(jì)模式

        完成Prototype設(shè)計(jì)模式

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

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

        Implementing the Prototype design Pattern



        當(dāng)我建立一個(gè)類的實(shí)例很復(fù)雜時(shí),我們可以使用Prototype模式。與其建立很多類的實(shí)例,還不如進(jìn)行適當(dāng)?shù)男薷暮,使用最初的?shí)例的副本。使用Prototype模式,可以通過(guò)克隆一個(gè)原型,減少子類的數(shù)量。Prototype模式可以減少類的實(shí)例的數(shù)量。

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

        克隆可以通過(guò)實(shí)現(xiàn)Icloneable接口來(lái)實(shí)現(xiàn)。Icloneable接口中唯一的方法是Clone,并返回一個(gè)新的類的實(shí)例。

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




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

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

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

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

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

        XML 文件




        VB.Net 實(shí)現(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

        溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 亚洲av日韩av综合| 77777_亚洲午夜久久多人| 亚洲日韩中文字幕无码一区| 中文字幕视频免费| 久久亚洲AV无码精品色午夜麻豆| 国产午夜精品久久久久免费视| 亚洲乱码无码永久不卡在线| 久久久WWW免费人成精品| 亚洲人成色77777| 一级毛片不卡片免费观看| 亚洲午夜视频在线观看| 99re6在线精品视频免费播放 | 亚洲六月丁香六月婷婷色伊人 | 免费网站看av片| 亚洲精品视频观看| 啦啦啦高清视频在线观看免费| 亚洲精品无码国产片| 亚洲国产婷婷综合在线精品| 久久精品无码免费不卡| 亚洲国产成人久久精品动漫| 国产又大又粗又长免费视频| 亚洲砖码砖专无区2023| 久久精品亚洲福利| 91精品免费观看| 欧美色欧美亚洲另类二区| 久久影视综合亚洲| 免费看h片的网站| 爱情岛亚洲论坛在线观看 | 免费在线观影网站| 亚洲高清免费在线观看| 日本特黄特色免费大片| 91精品全国免费观看青青| 亚洲女人初试黑人巨高清| 免费人成网站在线播放| 性xxxx视频免费播放直播| 亚洲精品一二三区| 亚洲熟妇av一区二区三区| 国产在线国偷精品产拍免费| 亚洲黄片手机免费观看| 精品久久久久久亚洲精品| 亚洲综合色视频在线观看|