Python设计模式

第一章: 设计模式基础

第二章: 常用设计模式

首页 > Python设计模式 > 第二章: 常用设计模式 > 2.2节: 单例模式

2.2节: 单例模式

薯条老师 2021-09-23 17:30:34 217138 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

2.2.1 单例模式

单例模式是指一个类只对应一个实例,通过类的全局方法来访问该实例。使用单例模式可以节约系统资源(时间+空间),避免对共享资源的重复占用,提升系统性能。

2.2.2 适用场景

在仅需一个实例对象就能实现需求的场景中,就应该使用单例模式,比如MySQL,Redis等数据库的连接对象,全局的计数器对象。单例模式的实现方式有饿汉式和懒汉式。饿汉式线程安全,在类加载时即被创建。懒汉式仅在需要的时候才被创建,会有线程安全的问题。

2.2.3 源码实现

现在通过单例模式来实现一个全局的计数器对象Counter, 以下为饿汉模式的单例:

# __author__ = 薯条老师,微信公众号:薯条编程

"""
单例模式是指一个类只对应一个实例,通过类的全局方法来访问该实例
"""


"""
(1) 定义一个全局的计数器对象Counter,以饿汉模式中的单例来实现
"""


class Counter:
    __instance = None
    """
    (2) 重写__new__方法来实现饿汉模式的单例  
    """

    def __new__(cls):
        if not cls.__instance:
            cls.__instance = super().__new__(cls)
        return cls.__instance

    def __init__(self):
        self._count = 0 if "_count" not in self.__dict__ else self.__dict__["_count"]

    @property
    def count(self):
        return self._count

    @count.setter
    def count(self, value):
        self._count += value


if __name__ == "__main__":
    counter = Counter()
    counter.count = 1
    counter = Counter()
    counter.count = 1
    # 输出的结果为2,说明为同一个对象
    print(counter.count)

以下为懒汉模式的单例:

# __author__ = 薯条老师,微信公众号:薯条编程

"""
单例模式是指一个类只对应一个实例,通过类的全局方法来访问该实例
"""

"""
(1) 定义一个全局的计数器对象Counter,以懒汉模式中的单例来实现
"""


class Counter:
    __instance = None
    """
    (2) 通过类方法来实现懒汉模式中的单例  
    """
    @classmethod
    def get_instance(cls):
        if not cls.__instance:
            cls.__instance = cls()
        return cls.__instance

    def __init__(self):
        self.__count = 0

    @property
    def count(self):
        return self.__count

    @count.setter
    def count(self, value):
        self.__count += value


if __name__ == "__main__":
    counter = Counter.get_instance()
    counter.count = 1
    counter = Counter.get_instance()
    counter.count = 1
    print(counter.count)

2.2.4 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论: