欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Simple Facotry from:UML軟件工程組織-火龍果軟件
Simple Facotry
作者:Hacken的專(zhuān)欄  來(lái)源:網(wǎng)絡(luò )
創(chuàng )建型模式
創(chuàng )建型模式(Creational Pattern)對類(lèi)的實(shí)例化過(guò)程進(jìn)行了抽象,能夠使軟件模塊做到與對象創(chuàng )建和組織的無(wú)關(guān)性。為了使體系結構更加清晰,一些軟件在設計上要求當創(chuàng )建類(lèi)的具體實(shí)例時(shí),能夠根據具體的語(yǔ)境來(lái)動(dòng)態(tài)地決定怎樣創(chuàng )建對象,創(chuàng )建哪些對象,以及怎樣組織和表示這些對象,而創(chuàng )建型模式所要描述的就是該如何來(lái)解決這些問(wèn)題。
按照生成目標的不同,創(chuàng )建型模式可以分為類(lèi)的創(chuàng )建型模式和對象的創(chuàng )建型模式兩種:
類(lèi)的創(chuàng )建型模式
類(lèi)的創(chuàng )建型模式通過(guò)使用繼承關(guān)系,將類(lèi)的創(chuàng )建交由具體的子類(lèi)來(lái)完成,這樣就向外界隱藏了如何得到具體類(lèi)的實(shí)現細節,以及這些類(lèi)的實(shí)例是如何被創(chuàng )建和組織在一起的。 對象的創(chuàng )建型模式
對象的創(chuàng )建型模式通過(guò)把對象的創(chuàng )建委托給另一個(gè)對象來(lái)完成,可以根據語(yǔ)境動(dòng)態(tài)地決定生成哪些具體類(lèi)的實(shí)例,同時(shí)還可以向外界隱藏這些實(shí)例是如何被創(chuàng )建以及如何被組織在一起的細節。
所有的創(chuàng )建型模式都有兩個(gè)永恒的主旋律:第一,它們都將系統使用哪些具體類(lèi)的信息封裝起來(lái);第二,它們隱藏了這些類(lèi)的實(shí)例是如何被創(chuàng )建和組織的。外界對于這些對象只知道它們共同的接口,而不清楚其具體的實(shí)現細節。正因如此,創(chuàng )建型模式在創(chuàng )建什么(what),由誰(shuí)(who)來(lái)創(chuàng )建,以及何時(shí)(when)創(chuàng )建這些方面,都為軟件設計者提供了盡可能大的靈活性。
具體到Python來(lái)說(shuō),假設有這樣一個(gè)類(lèi):
class Person: def __init__(self, name): self.name = name
要創(chuàng )建該類(lèi)的一個(gè)實(shí)例,則應該執行下面的語(yǔ)句:
p = Person("Gary")
但如果創(chuàng )建對象時(shí)完成的工作非常復雜,需要一段很長(cháng)的代碼,你就不能簡(jiǎn)單地將其全部寫(xiě)入__init__方法中,因為這會(huì )違背面向對象思想的兩個(gè)基本原則:封裝(encapsulation)和委派(delegation)。假如執意要做樣做,結果只會(huì )使你的代碼變成一段行為固定的硬編碼(hard coding),而整個(gè)軟件的結構都極有可能變得非常糟糕,因為其它某個(gè)模塊也許就正依賴(lài)于你所創(chuàng )建的這個(gè)實(shí)例,這樣就在無(wú)形之間增加了模塊之間的耦合度。
將Python對象的創(chuàng )建過(guò)程封裝到某個(gè)類(lèi)中來(lái)單獨完成,可以使你的程序變得更加靈活和通用。實(shí)踐證明,使用下面的六種創(chuàng )建型模式可以更好地改善對象的創(chuàng )建過(guò)程:
Simple Factory模式
專(zhuān)門(mén)定義一個(gè)類(lèi)來(lái)負責創(chuàng )建其它類(lèi)的實(shí)例,被創(chuàng )建的實(shí)例通常都具有共同的父類(lèi)。 Factory Method模式
將對象的創(chuàng )建交由父類(lèi)中定義的一個(gè)標準方法來(lái)完成,而不是其構造函數,究竟應該創(chuàng )建何種對象由具體的子類(lèi)負責決定。 Abstract Factory模式
提供一個(gè)共同的接口來(lái)創(chuàng )建相互關(guān)聯(lián)的多個(gè)對象。 Singleton模式
保證系統只會(huì )產(chǎn)生該類(lèi)的一個(gè)實(shí)例,同時(shí)還負責向外界提供訪(fǎng)問(wèn)該實(shí)例的標準方法。 Builder模式
將復雜對象的創(chuàng )建同它們的具體表現形式(representation)區別開(kāi)來(lái),這樣可以根據需要得到具有不同表現形式的對象。 Prototype模式
利用一個(gè)能對自身進(jìn)行復制的類(lèi),使得對象的動(dòng)態(tài)創(chuàng )建變得更加容易。
二、模式引入
簡(jiǎn)單工廠(chǎng)(Simple Factory)模式又稱(chēng)為靜態(tài)工廠(chǎng)方法(Static Factory Method)模式,屬于類(lèi)的創(chuàng )建型模式。這種模式根據外界給定的信息,由"工廠(chǎng)"對象"制造"出某些可能"產(chǎn)品"類(lèi)中的一個(gè)實(shí)例,工廠(chǎng)對象能夠處理的所有類(lèi)通常都繼承于同一個(gè)父類(lèi),并且對外界提供基本相同的接口,只不過(guò)在具體實(shí)現時(shí)會(huì )有所差別罷了。
假設我們要開(kāi)發(fā)一個(gè)繪圖程序,用來(lái)繪制簡(jiǎn)單的幾何圖形,這個(gè)軟件應該能夠處理下面的幾種幾何對象:
圓形(Circle) 矩形(Rectangle) 菱形(Diamond)
除了各自特有的屬性和方法之外,所有的幾何圖形幾乎都可以抽象出繪制(draw)和擦除(erase)兩個(gè)公共方法,因而可以為它們定義一個(gè)共同的接口Shape。雖然Python語(yǔ)言本身并不支持接口,但為了更好地闡明設計模式的思想,有時(shí)我們還是會(huì )借用一下UML中的接口這一概念。這樣一來(lái),各個(gè)類(lèi)之間的關(guān)系就將如圖1所示:
圖1
Shape接口定義了所有幾何圖形都必須實(shí)現的公共方法: draw()和erase(),實(shí)現該接口的Python代碼如下所示,Python中沒(méi)有接口的概念,因此在具體實(shí)現時(shí)可以使用類(lèi)來(lái)替代。
代碼清單1:shape.pyclass Shape: # 繪制圖形 def draw(self): pass # 擦除圖形 def erase(self): pass
Circle類(lèi)是Shape的一種具體形式,它實(shí)現了Shape接口定義的所有方法,此外還添加了一個(gè)屬性__radius,用來(lái)表示圓的半徑。以下是實(shí)現Circle類(lèi)的代碼:
代碼清單2:circle.pyclass Circle (Shape): def __init__(self, radius = 0): self.__radius = radius # 繪制圓形 def draw(self): print "Draw Circle" # 擦除圓形 def erase(self): print "Erase Circle" # 半徑的取值方法 def getRadius(self): return self.__radius # 半徑的賦值方法 def setRadius(self, radius): self.__radius = radius
Rectangle類(lèi)也是Shape的一種具體形式,它實(shí)現了Shape接口定義的所有方法,并添加了__width和__height兩個(gè)屬性,分別表示矩形的寬度和高度。以下是實(shí)現Rectangle類(lèi)的代碼:
代碼清單3:rectangle.pyclass Rectangle (Shape): def __init__(self, width = 0, height = 0): self.__width = width self.__height = height # 繪制矩形 def draw(self): print "Draw Rectangle" # 擦除矩形 def erase(self): print "Erase Rectangle" # 寬度的取值方法 def getWidth(self): return self.__width # 寬度的賦值方法 def setWidth(self, width): self.__width = width # 高度的取值方法 def getHeight(self): return self.__height # 高度的賦值方法 def setHeight(self, height): self.__height = height
同樣,Diamond類(lèi)也是Shape的一種具體形式,它實(shí)現了Shape接口中定義的所有方法,并且添加了__width和__height兩個(gè)屬性,分別表示菱形的寬度和高度。以下是實(shí)現Diamond類(lèi)的代碼:
代碼清單4:diamond.pyclass Diamond (Shape): def __init__(self, width = 0, height = 0): self.__width = width self.__height = height # 繪制菱形 def draw(self): print "Draw Diamond" # 擦除菱形 def erase(self): print "Erase Diamond" # 寬度的取值方法 def getWidth(self): return self.__width # 寬度的賦值方法 def setWidth(self, width): self.__width = width # 高度的取值方法 def getHeight(self): return self.__height # 高度的賦值方法 def setHeight(self, height): self.__height = height
所有幾何圖形類(lèi)都定義好后,下面要做的就是提供一個(gè)"工廠(chǎng)"類(lèi)ShapeFactory,來(lái)創(chuàng )建各種幾何圖形的具體實(shí)例。ShapeFactory類(lèi)的作用就是根據外界的要求,創(chuàng )建出不同的幾何圖形對象,如圓形(Circle)、矩形(Rectangle)或菱形(Diamond),這樣整個(gè)軟件的體系結構就將如圖2所示。
圖2
ShapeFactory類(lèi)用于創(chuàng )建各種幾何圖形的實(shí)例,其實(shí)現代碼如下所示:
代碼清單5:shapefactory.pyclass ShapeFactory: def factory(self, which): if which == "Circle": return Circle() elif which == "Rectangle": return Rectangle() elif which == "Diamond": return Diamond() else: return None
在ShapeFactory類(lèi)中只定義了一個(gè)方法factory(),外界通過(guò)調用該方法,來(lái)創(chuàng )建其所需的幾何圖形對象,但如果所請求的類(lèi)是系統所不支持的,則將返回None。在引入了工廠(chǎng)類(lèi)之后,其它模塊如果想生成幾何圖形類(lèi)的實(shí)例,只需調用ShapeFactory類(lèi)的factory()方法就可以了:
fac = ShapeFactory()shape = fac.factory("Diamond")if shape != None: shape.draw()
就樣就成功地將類(lèi)是如何創(chuàng )建的這一實(shí)現細節向外界隱藏起來(lái)了,這就是簡(jiǎn)單工廠(chǎng)模式所采取的基本策略。
三、一般結構
簡(jiǎn)單工廠(chǎng)模式屬于類(lèi)的創(chuàng )建型模式,適合用來(lái)對大量具有共同接口的類(lèi)進(jìn)行實(shí)例化,它可以推遲到運行的時(shí)候才動(dòng)態(tài)決定要創(chuàng )建哪個(gè)類(lèi)的實(shí)例,而不是在編譯時(shí)就必須知道要實(shí)例化哪個(gè)類(lèi)。簡(jiǎn)單工廠(chǎng)模式的一般性結構如圖3所示:
圖3
簡(jiǎn)單工廠(chǎng)模式的實(shí)質(zhì)是由一個(gè)工廠(chǎng)類(lèi)根據傳入的參量,動(dòng)態(tài)決定應該創(chuàng )建出哪一個(gè)產(chǎn)品類(lèi)的實(shí)例。從上圖可以看出,簡(jiǎn)單工廠(chǎng)模式涉及到工廠(chǎng)角色、抽象產(chǎn)品角色和具體產(chǎn)品角色三個(gè)參與者。
工廠(chǎng)(Creator)角色
是簡(jiǎn)單工廠(chǎng)模式的核心,它負責實(shí)現創(chuàng )建所有實(shí)例的內部邏輯。工廠(chǎng)類(lèi)可以被外界直接調用,創(chuàng )建所需的產(chǎn)品對象。 抽象產(chǎn)品(Product)角色
是簡(jiǎn)單工廠(chǎng)模式所創(chuàng )建的所有對象的父類(lèi),它負責描述所有實(shí)例所共有的公共接口。 具體產(chǎn)品(Concrete Product)角色
是簡(jiǎn)單工廠(chǎng)模式的創(chuàng )建目標,所有創(chuàng )建的對象都是充當這個(gè)角色的某個(gè)具體類(lèi)的實(shí)例。
工廠(chǎng)角色負責創(chuàng )建一個(gè)具體產(chǎn)品的實(shí)例,并將其返回給調用者,以下是工廠(chǎng)類(lèi)的示例性Python代碼:
代碼清單6:creator.pyclass Creator: # 創(chuàng )建具體產(chǎn)品類(lèi)的方法 def factory(self): return ConcreteProduct()
抽象產(chǎn)品角色的主要目的是為所有的具體產(chǎn)品提供一個(gè)共同的接口,通常只需給出相應的聲明就可以了,而不用給出具體的實(shí)現。以下是抽象產(chǎn)品類(lèi)的示例性Python代碼:
代碼清單7:product.pyclass Product: # 所有具體產(chǎn)品類(lèi)的公共接口 def interface(self): pass
具體產(chǎn)品角色充當最終的創(chuàng )建目標,一般來(lái)講它是抽象產(chǎn)品類(lèi)的子類(lèi),實(shí)現了抽象產(chǎn)品類(lèi)中定義的所有接口方法。以下是具體產(chǎn)品類(lèi)的示例性Python代碼:
代碼清單8:concrete.pyclass ConcreteProduct(Product): # 公共接口的實(shí)現 def interface(self): print "Concrete Product Method"
在應用簡(jiǎn)單工廠(chǎng)模式時(shí),可以采用下面的示例性Python代碼:
fac = Creator()p = fac.factory()if p != None: p.interface()
在這個(gè)簡(jiǎn)單的示意性實(shí)現里,充當具體產(chǎn)品角色的類(lèi)只有一個(gè),但在真正的實(shí)際應用中,通常遇到的都是同時(shí)有多個(gè)具體產(chǎn)品類(lèi)的情況。
四、實(shí)際運用
在運用簡(jiǎn)單工廠(chǎng)模式開(kāi)發(fā)真正的軟件系統時(shí),抽象產(chǎn)品和具體產(chǎn)品之間可能會(huì )形成非常復雜的樹(shù)狀結構,如圖4所示。
圖4
雖然這樣的結構并不符合所有具體產(chǎn)品類(lèi)都繼承于同一抽象產(chǎn)品類(lèi)的基本原則,但也不難發(fā)現其實(shí)所有的具體產(chǎn)品類(lèi)歸根結底都源自于同一個(gè)抽象產(chǎn)口類(lèi),遇到這種情況時(shí)只需稍加變通,依然能夠使用同一個(gè)工廠(chǎng)類(lèi)來(lái)創(chuàng )建所有具體產(chǎn)品類(lèi)的實(shí)例,只不過(guò)此時(shí)的軟件結構將如圖5所示。
圖5
當抽象產(chǎn)品類(lèi)和具體產(chǎn)品類(lèi)的關(guān)系變得復雜起來(lái)時(shí),使用簡(jiǎn)單工廠(chǎng)模式的一個(gè)好處就是各種產(chǎn)品類(lèi)之間的結構關(guān)系不會(huì )反映到工廠(chǎng)類(lèi)中,并且它們結構上的變化也不會(huì )影響到工廠(chǎng)類(lèi)。正是因為簡(jiǎn)單工廠(chǎng)模式對各種具體產(chǎn)品類(lèi)者是單獨對待的,因此工廠(chǎng)類(lèi)并不需要弄清楚它們之間的結構關(guān)系,而只需知道究竟有哪些具體產(chǎn)品類(lèi)可以被實(shí)例化以及如何實(shí)例化就可以了。不過(guò)這樣做有時(shí)也會(huì )產(chǎn)生一些麻煩,那就是在增加新的具體產(chǎn)品類(lèi)時(shí),不可避免地會(huì )導致對工廠(chǎng)類(lèi)的修改。
如果在實(shí)際中運用簡(jiǎn)單工廠(chǎng)模式時(shí)遇到只有一個(gè)具體產(chǎn)品類(lèi)的情況,為了簡(jiǎn)化軟件體系結構,可以考慮對簡(jiǎn)單工廠(chǎng)模式進(jìn)行精簡(jiǎn),省略抽象產(chǎn)品這一角色。此時(shí)簡(jiǎn)單工廠(chǎng)模式的結構將如圖6所示。
圖6
在簡(jiǎn)單廠(chǎng)模式中,充當工廠(chǎng)角色的類(lèi)通常只會(huì )有一個(gè)方法,那就是用來(lái)創(chuàng )建具體產(chǎn)品對象的factory()。在某些特殊場(chǎng)合下,如果需要的話(huà)也可以考慮將工廠(chǎng)角色的功能交由抽象產(chǎn)品角色來(lái)替代完成,這時(shí)簡(jiǎn)單工廠(chǎng)模式的結構將如圖7所示。
圖7
在更極端的情況下,工廠(chǎng)角色、抽象產(chǎn)品角色和具體產(chǎn)品角色三者可以合并,即將所有的功能都交由具體產(chǎn)品類(lèi)來(lái)統一完成。也就是說(shuō),簡(jiǎn)單工廠(chǎng)模式將退化成一個(gè)單獨的具體產(chǎn)品類(lèi),這個(gè)類(lèi)同時(shí)也是自身的工廠(chǎng),負責創(chuàng )建自己的實(shí)例,如圖8所示。
圖8
這種退化的簡(jiǎn)單工廠(chǎng)模式從實(shí)質(zhì)上講等價(jià)于一個(gè)類(lèi),唯一不同的是在對象初始化時(shí)不再使用默認的構造方法,而是使用自定義的工廠(chǎng)方法,但這在許多場(chǎng)合下的意義并不是很大,尤其是對Python這種動(dòng)態(tài)類(lèi)型語(yǔ)言來(lái)說(shuō)更是如此。由于退化后的模式并沒(méi)有充分利用簡(jiǎn)單工廠(chǎng)模式的特點(diǎn),所以最好慎重使用,當然也可以考慮用其它模式進(jìn)行替代。
五、優(yōu)勢和不足
在簡(jiǎn)單工廠(chǎng)模式中,工廠(chǎng)類(lèi)是整個(gè)模式的關(guān)鍵所在,它包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟應該創(chuàng )建哪個(gè)具體類(lèi)的對象。通過(guò)使用工廠(chǎng)類(lèi),外界可以從直接創(chuàng )建具體產(chǎn)品對象的尷尬局面中擺脫出來(lái),僅僅只需要負責"消費"對象就可以了,而不必管這些對象究竟是如何創(chuàng )建以及如何組織的,這樣就清晰了各自的職責和權力,有利于整個(gè)軟件體系結構的優(yōu)化。
不過(guò),凡事有利就有弊,簡(jiǎn)單工廠(chǎng)模式的缺點(diǎn)也正體現在其工廠(chǎng)類(lèi)上。由于工廠(chǎng)類(lèi)集中了所有實(shí)例的創(chuàng )建邏輯,是一個(gè)無(wú)所不能的"全能類(lèi)"(God Class),因此它對整個(gè)軟件系統是至關(guān)重要的,如果這個(gè)類(lèi)無(wú)法正常工作,其它部分可能都會(huì )受到牽連,正所謂"城門(mén)失火,殃及池魚(yú)"。
將全部創(chuàng )建邏輯都集中到一個(gè)工廠(chǎng)類(lèi)中還有另外一個(gè)缺點(diǎn),那就是當系統中的具體產(chǎn)品類(lèi)不斷增多時(shí),可能會(huì )出現要求工廠(chǎng)類(lèi)根據不同條件創(chuàng )建不同實(shí)例的需求,這種對條件的判斷和對具體產(chǎn)品類(lèi)型的判斷交織在一起,很難避免模塊功能的蔓延,對系統的擴展和維護也非常不利。
簡(jiǎn)單工廠(chǎng)模式的這些缺點(diǎn),在下次將要介紹的工廠(chǎng)方法(Factory Method)模式中得到了一定程度上的克服,好了,下次再見(jiàn)吧!
六、小結
創(chuàng )建型模式的目標是做到對象創(chuàng )建和組織的無(wú)關(guān)性,它可以細分為類(lèi)的創(chuàng )建型模式和對象的創(chuàng )建型模式。簡(jiǎn)單工廠(chǎng)模式屬于類(lèi)的創(chuàng )建型模式,它可以根據外界所給定的信息,用工廠(chǎng)對象制造出某種特定產(chǎn)品類(lèi)的實(shí)例。完整的簡(jiǎn)單工廠(chǎng)模式包含工廠(chǎng)、抽象產(chǎn)品和具體產(chǎn)品三個(gè)角色,但在實(shí)際運用時(shí)可以靈活掌握,對模型進(jìn)行簡(jiǎn)單化。簡(jiǎn)單工廠(chǎng)模式的優(yōu)點(diǎn)是它的工廠(chǎng)類(lèi)能夠負責所有對象的創(chuàng )建,而缺點(diǎn)則是工廠(chǎng)類(lèi)的實(shí)現邏輯可能過(guò)于復雜。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
抽象工廠(chǎng)模式
Python設計模式:工廠(chǎng)方法模式初探
python設計模式
7. 工廠(chǎng)系列
Java版模式速查手冊
設計模式的UML圖(轉)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久