python學習--設計模式之單例模式

設計模式之------>>>單例模式

(一)什麼是單例模式

單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。

(二)實現單例的方法

  • 導入模塊
  • 使用new方法
  • 使用裝飾器

(三)模塊

Python 模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。因此,我們只需把相關的函數和數據定義在一個模塊中,就可以獲得一個單例對象了。

(四)new方法

# -*- coding: utf-8 -*-

__author__ = 'loco_python'


class Person(object):
    _instance = None
    _is_init = False
    # 實現單例模式
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            # 如果沒有創建對象,我們就創建對象
            cls._instance = super(Person, cls).__new__(cls, *args, **kwargs)
        # 無論如何我們只返回一個對象
        return cls._instance

    # 只做一次初始化。
    def __init__(self, name, age):
        if not self._is_init:
            self.name = name
            self.age = age
            self._is_init = True

    def __str__(self):
        return self.name

p1 = Person('xiaohua', 18)
p2 = Person('xiaowang', 19)
# p1和p2同一地址
print id(p1), id(p2)  # 4308349264 4308349264
# 只初始化了第一次
print p1, p2     # xiaohua xiaohua  

(五)裝飾器

__author__ = 'loco_python'

from functools import wraps


def singleton(cls):
    _instance = {}
    @wraps(cls)
    def wrapper(*args, **kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]
    return wrapper

@singleton
class Person:
    def __init__(self):
        pass

p = Person()
p1 = Person()
print id(p), id(p1)   # 4501461760 4501461760
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章