python中的設計模式

代碼環境:python3.6

單例模式

單例模式,能夠確保某個類只有一個實例存在。python

from threading import Thread, Lock


class Singleton:
    """線程安全的單例模式"""
    _instance_lock = Lock()
    _init_lock = Lock()

    def __new__(cls, *args, **kwargs):
        # 確保只有一個實例
        with Singleton._instance_lock:
            if not hasattr(Singleton, '_instance'):
                print('first new')
                Singleton._instance = object.__new__(cls)
        return Singleton._instance

    def __init__(self):
        # 只運行一次init
        with Singleton._init_lock:
            if not hasattr(Singleton, '_first_init'):
                print('first init')
                Singleton._first_init = True


def task(i):
    obj = Singleton()
    print(f'Thread-{i}: {obj}')


if __name__ == "__main__":
    for i in range(10):
        t = Thread(target=task, args=(i, ))
        t.start()

裝飾器模式

咱們給一個對象擴展附加功能有多種方式,裝飾器模式就是其中一種。編程

不少編程語言中,裝飾器模式經過繼承實現,在 python 中可使用內置的裝飾器功能。segmentfault

須要注意的是,實現裝飾器模式只是 python 裝飾器的其中一個用法,python 裝飾器實際上能作的事情比裝飾器模式多得多。安全

對於 python 裝飾器的更多介紹,有興趣的朋友能夠看我另外一篇文章:python中的裝飾器編程語言

工廠模式

工廠模式,就是咱們能夠經過一個指定的「工廠」得到須要的「產品」。在這種模式中,用戶只需經過固定的接口而不是直接去調用類的實例化方法來得到一個對象實例,隱藏了實例建立過程的複雜度,解耦了生產實例和使用實例的代碼,下降了維護的複雜性。函數

1. 簡單工廠模式

假如咱們有一個簡單的汽車工廠,只生產兩種汽車,奔馳和寶馬:線程

class Benz:
    """奔馳"""
    def __repr__(self):
        return 'This is Benz'


class BMW:
    """寶馬"""
    def __repr__(self):
        return 'This is BMW'


class CarFactory:
    """簡單工廠,根據類型生產汽車"""
    def produce_car(self, typename):
        if typename == 'benz':
            return Benz()
        elif typename == 'bmw':
            return BMW()


def main():
    """
    有了上面的簡單工廠類,咱們能夠經過向固定的接口傳入參數得到想要的汽車對象
    """
    car_factory = CarFactory()
    car1 = car_factory.produce_car('benz')
    car2 = car_factory.produce_car('bmw')
    print(f'car1: {car1}')
    print(f'car2: {car2}')


if __name__ == "__main__":
    main()

2. 工廠方法模式

上面咱們有了一個簡單的工廠,但若是咱們要新增一個產品奧迪汽車,除了要新增長一個Audi類以外,還要修改CarFactory中的produce_car方法,這樣不利於之後的擴展。code

因此咱們在簡單工廠的基礎上,抽象出不一樣的工廠,每一個工廠對應生產本身的產品,這就是工廠方法。對象

class Benz:
    """奔馳"""
    def __repr__(self):
        return 'This is Benz'


class BMW:
    """寶馬"""
    def __repr__(self):
        return 'This is BMW'


class AbsFactory:
    """抽象工廠"""
    def produce_car(self):
        # 只定義了方法,並無實現,具體功能在子類中實現
        pass


class BenzFactory(AbsFactory):
    """奔馳工廠"""
    def produce_car(self):
        return Benz()


class BMWFactory(AbsFactory):
    """寶馬工廠"""
    def produce_car(self):
        return BMW()


def main():
    """
    咱們能夠經過特定的工廠來得到特定的產品
    """
    car1 = BenzFactory().produce_car()
    car2 = BMWFactory().produce_car()
    print(f'car1: {car1}')
    print(f'car2: {car2}')


if __name__ == "__main__":
    main()

原型模式

原型模式有助於咱們建立一個對象的克隆。在最簡單的版本中,原型模式只是一個接受對象做爲入參並返回這個對象克隆的clone函數。繼承

在 python 中並無提到原型模式,由於已經內置了copy.deepcopy函數實現了。

相關文章
相關標籤/搜索