国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

比較全面的單例模式和工廠模式

chemzqm / 873人閱讀

摘要:還有一個工廠類。工廠類有一個方法名有兩個輸入參數,名字和性別。用戶使用工廠類,通過調用方法。抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。

概念
工廠模式:工廠模式就是不管如何實現的,只需要調用抽象話的接口就可以創建出特定類型的實例對象

簡單工廠模式:
eg:一個例子更能很好的理解以上的內容:
我們有一個基類Person ,包涵獲取名字,性別的方法 。有兩個子類male 和female,可以打招呼。還有一個工廠類。
工廠類有一個方法名getPerson有兩個輸入參數,名字和性別。
用戶使用工廠類,通過調用getPerson方法。

在程序運行期間,用戶傳遞性別給工廠,工廠創建一個與性別有關的對象。因此工廠類在運行期,決定了哪個對象應該被創建。

class Person:

def __init__(self):
    self.name = None
    self.gender = None

def getName(self):
    return self.name

def getGender(self):
    return self.gender

class Male(Person):

def __init__(self, name):
    print "Hello Mr." + name

class Female(Person):

def __init__(self, name):
    print "Hello Miss." + name

class Factory:

def getPerson(self, name, gender):
    if gender == ‘M":
            return Male(name)
        if gender == "F":
        return Female(name)

if name == "__main__":

factory = Factory()
person = factory.getPerson("Chetan", "M")


抽象工廠模式:
提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。
class Burger():

"""
漢堡
"""
name=""
price=0.0
type="BURGER"
def getPrice(self):
    return self.price
def setPrice(self,price):
    self.price=price
def getName(self):
    return self.name

class CheeseBurger(Burger):

def __init__(self):
    self.name="cheese burger"
    self.price=10.0

class SpicyChickenBurger(Burger):

def __init__(self):
    self.name="spicy chicken burger"
    self.price=15.0

class Snack():

"""
小食類
"""
name = ""
price = 0.0
type = "SNACK"
def getPrice(self):
    return self.price
def setPrice(self, price):
    self.price = price
def getName(self):
    return self.name

class Chips(Snack):

def __init__(self):
    self.name = "chips"
    self.price = 6.0

class ChickenWings(Snack):

def __init__(self):
    self.name = "chicken wings"
    self.price = 12.0

class Beverage():

"""
飲料
"""
name = ""
price = 0.0
type = "BEVERAGE"
def getPrice(self):
    return self.price
def setPrice(self, price):
    self.price = price
def getName(self):
    return self.name

class Coke(Beverage):

def __init__(self):
    self.name = "coke"
    self.price = 4.0

class Milk(Beverage):

def __init__(self):
    self.name = "milk"
    self.price = 5.0
以上的Burger,Snack,Beverage,都可以認為是該快餐店的產品,由于只提供了抽象方法,我們把它們叫抽象產品類,而cheese burger等6個由抽象產品類衍生出的子類,叫作具體產品類。

class FoodFactory():

"""
抽象工廠foodFactory為抽象的工廠類,而burgerFactory,snackFactory,beverageFactory為具體的工廠類。
"""
type=""
def createFood(self,foodClass):
    print(self.type," factory produce a instance.")
    foodIns=foodClass()
    return foodIns

class BurgerFactory(foodFactory):

def __init__(self):
    self.type="BURGER"

class SnackFactory(foodFactory):

def __init__(self):
    self.type="SNACK"

class BeverageFactory(foodFactory):

def __init__(self):
    self.type="BEVERAGE"

if __name__=="__main__":

burger_factory=burgerFactory()
snack_factory=snackFactory()
beverage_factory=beverageFactory()
cheese_burger=burger_factory.createFood(cheeseBurger)
print(cheese_burger.getName(),cheese_burger.getPrice())
chicken_wings=snack_factory.createFood(chickenWings)
print(chicken_wings.getName(),chicken_wings.getPrice())
coke_drink=beverage_factory.createFood(coke)
print(coke_drink.getName(),coke_drink.getPrice())

工廠模式優點
工廠方法用來創建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節 能夠讓工廠自主確定創建何種產品對象,而如何創建這個對象的細節則完全封裝在具體工廠內部 在系統中加入新產品時,完全符合開閉原則
工廠模式缺點
系統中類的個數將成對增加,在一定程度上增加了系統的復雜度,會給系統帶來一些額外的開銷 增加了系統的抽象性和理解難度
工廠模式適用環境
客戶端不知道它所需要的對象的類(客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體產品對象由具體工廠類創建) 抽象工廠類通過其子類來指定創建哪個對象

抽象工廠模式:
模式優點
隔離了具體類的生成,使得客戶端并不需要知道什么被創建 當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象 增加新的產品族很方便,無須修改已有系統,符合開閉原則
模式缺點
增加新的產品等級結構麻煩,需要對原有系統進行較大的修改,甚至需要修改抽象層代碼,這顯然會帶來較大的不便,違背了開閉原則
模式適用環境
一個系統不應當依賴于產品類實例如何被創建、組合和表達的細節 系統中有多于一個的產品族,但每次只使用其中某一產品族 屬于同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來 產品等級結構穩定,設計完成之后,不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構

單例模式
單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。 eg:系統中的打印機
實現方式:
使用模塊:
在mysingleton.py模塊文件中:(因為模塊在第一次導入時生成了.pyc文件,下次會直接從這個里面加載,不需要重新生成)
class Singleton:(object):

 def foo(self):
   pass

singleton = Singeton()

在其他文件中調用:
from mysingleton import singleton
使用裝飾器:
def Singleton(cls):

_instance = {}

def _singleton(*args, **kargs):
此處是核心代碼
    if cls not in _instance:
        _instance[cls] = cls(*args, **kargs)
    return _instance[cls]
此處是核心代碼
return _singleton

@Singleton
class A(object):

a = 1

def __init__(self, x=0):
    self.x = x

a1 = A(2)
a2 = A(3)
print(id(a1))
print(id(a2))

使用類
import time
import threading
class Singleton(object):

_instance_lock = threading.Lock()

def __init__(self):
    time.sleep(1)

@classmethod
def instance(cls, *args, **kwargs):
    if not hasattr(Singleton, "_instance"):
        with Singleton._instance_lock:
            if not hasattr(Singleton, "_instance"):
                Singleton._instance = Singleton(*args, **kwargs)
    return Singleton._instance

def task(arg):

obj = Singleton.instance()
print(obj)

for i in range(10):

t = threading.Thread(target=task,args=[i,])
t.start()

time.sleep(20)
obj = Singleton.instance()
print(obj)

考慮了多線程問題,進行加鎖,避免運行太快,如果在__init__中有IO操作,造成創建單例失敗,,最后優化必須通過obj= Singleton.instance()來實現單例,如果是obj = Singleton()創建的不是單例

基于__new__方法創建單例
import threading
class Singleton(object):

_instance_lock = threading.Lock()

def __init__(self):
    pass


def __new__(cls, *args, **kwargs):
    if not hasattr(Singleton, "_instance"):
        with Singleton._instance_lock:
            if not hasattr(Singleton, "_instance"):
                Singleton._instance = object.__new__(cls)  
    return Singleton._instance

obj1 = Singleton()
obj2 = Singleton()
print(obj1,obj2)

def task(arg):

obj = Singleton()
print(obj)

for i in range(10):

t = threading.Thread(target=task,args=[i,])
t.start()

基于metaclass方式來實現
import threading

class SingletonType(type):

_instance_lock = threading.Lock()
def __call__(cls, *args, **kwargs):
    if not hasattr(cls, "_instance"):
        with SingletonType._instance_lock:
            if not hasattr(cls, "_instance"):
                cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
    return cls._instance

class Foo(metaclass=SingletonType):

def __init__(self,name):
    self.name = name

obj1 = Foo("name")
obj2 = Foo("name")
print(obj1,obj2)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43679.html

相關文章

  • Spring IOC知識點一網打盡!

    摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統一配置,便于修改。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 工廠模式理解了沒有? 在刷Spring書籍的時候花了點時間去學習了單例模式和工廠模式,總的來說還是非常值得的! 本來想的是刷完《Spring 實戰 (第4版)》和《精通Spring4.x 企業應用開發實戰》...

    djfml 評論0 收藏0
  • 設計模式單例模式

    摘要:單例模式關注的重點私有構造器線程安全延遲加載序列化和反序列化安全反射攻擊安全相關設計模式單例模式和工廠模式工廠類可以設計成單例模式。 0x01.定義與類型 定義:保證一個類僅有一個實例,并提供一個全局訪問點 類型:創建型 UML showImg(https://segmentfault.com/img/bVbtDJ2?w=402&h=268); 單例模式的基本要素 私有的構造方...

    陸斌 評論0 收藏0
  • Java設計模式優化-單例模式

    摘要:單例模式概述單例模式是一種對象創建模式,用于產生一個類的具體事例。所以解決了線程安全問題參考失效原因和解決方案中單例模式的缺陷及單例的正確寫法懶漢式靜態內部類私有構造器獲取單例的方法靜態內部類持有單例作為靜態屬性。 單例模式概述 單例模式是一種對象創建模式,用于產生一個類的具體事例。使用單例模式可以確保整個系統中單例類只產生一個實例。有下面兩大好處: 對于頻繁創建的對象,節省初第一...

    eccozhou 評論0 收藏0
  • 又被面試官問設計模式了,我真的是

    摘要:面試官要不你來手寫下單例模式唄候選者單例模式一般會有好幾種寫法候選者餓漢式簡單懶漢式在方法聲明時加鎖雙重檢驗加鎖進階懶漢式靜態內部類優雅懶漢式枚舉候選者所謂餓漢式指的就是還沒被用到,就直接初始化了對象。面試官:我看你的簡歷寫著熟悉常見的設計模式,要不你來簡單聊聊你熟悉哪幾個吧?候選者:常見的工廠模式、代理模式、模板方法模式、責任鏈模式、單例模式、包裝設計模式、策略模式等都是有所了解的候選者:...

    不知名網友 評論0 收藏0
  • 23種設計模式

    摘要:抽象工廠模式多個抽象產品類,個抽象產品類可以派生出多個具體產品類。用了工廠方法模式,你替換生成鍵盤的工廠方法,就可以把鍵盤從羅技換到微軟。好處避免頻繁創建對象,節省系統開銷,減輕壓力。 總體分為3大類:創建型模式 (5種):工廠方法、抽象工廠、單例、建造者、原型結構型模式(7種):適配器、裝飾器、代理、外觀、橋接、組合、享元行為型模式(11種):策略、模板方法、觀察者、迭代子、責任鏈、...

    xiaokai 評論0 收藏0

發表評論

0條評論

chemzqm

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<