VB實(shí)例(設(shè)計(jì)模式能夠自舉的基類)

字號(hào):

最近開(kāi)發(fā)中正好有這么一個(gè)需求,就是需要一個(gè)基類,這個(gè)基類將在另外一些類里被運(yùn)用;但是這個(gè)基類的實(shí)例最后會(huì)是哪一個(gè)派生類,調(diào)用者是不知道的。倘若要讓調(diào)用者知道具體的派生類,就是在前端代碼里創(chuàng)建一個(gè)派生類的實(shí)例并且傳遞給調(diào)用者,可能是不妥當(dāng)?shù)?,因?yàn)檎{(diào)用者是分散而不確定的,即使它們有著的入口點(diǎn)。如果我話說(shuō)得特不明白,您還是沒(méi)法子理解,那還是舉一個(gè)例子來(lái)說(shuō)吧。其實(shí)您可以把它想成是 XmlDocument 和 XmlReader,因?yàn)?XmlReader 是有兩個(gè)派生實(shí)例的,它和我這個(gè)場(chǎng)景很大程度上是比較類似的。
    我們都知道,XmlReader 的創(chuàng)建不一定要直接用 New XmlTextReader() 完成,其實(shí)也可以用 XmlReader.Create()。但是,我今天并不是想探究 XmlReader 它的創(chuàng)建原理,因?yàn)槲覀兛梢匀タ?.Net Framework 的源代碼,無(wú)論是官方的還是 Reflector 給出的。我的構(gòu)想是,讓基類能夠自舉,就意味著它是自己的工廠。但是,基類是不會(huì)知道派生類是什么的,也不知道運(yùn)行時(shí)將選擇的派生類;我希望最終的調(diào)用代碼可以在使用前設(shè)置將被使用的派生類。
    看代碼了:
    簡(jiǎn)化示例: 能夠自舉的基類
    /**/’’’
    ’’’ XHtml => WikiText 基礎(chǔ)轉(zhuǎn)換器。
    ’’’

    Public MustInherit Class XHtmlParserClass XHtmlParser
    實(shí)例創(chuàng)建器#Region \" 實(shí)例創(chuàng)建器 \"
    /**/’’’
    ’’’ 當(dāng)前的實(shí)例創(chuàng)建器。
    ’’’

    Private Shared Creater As Func(Of XHtmlParser) = Function (()Function() Nothing
    /**/’’’
    ’’’ 創(chuàng)建一個(gè) XHtml => WikiText 轉(zhuǎn)換器。
    ’’’

    Public Shared Function CreateInstance()Function CreateInstance() As XHtmlParser
    SyncLock Creater
     Return Creater.Invoke()
    End SyncLock
    End Function
    /**/’’’
    ’’’ 注冊(cè)一個(gè) XHtml => WikiText 轉(zhuǎn)換器。
    ’’’

    Public Shared Sub RegisterCreater()Sub RegisterCreater(ByVal NewCreater As Func(Of XHtmlParser))
    SyncLock Creater
     Creater = NewCreater
    End SyncLock
    End Sub
    #End Region
    End Class