• python 设计模式之单例模式 Singleton Pattern


     

     

     

    #引入

    一个类被设计出来,就意味着它具有某种行为(方法),属性(成员变量)。一般情况下,当我们想使用这个类时,会使用new 关键字,这时候jvm会帮我们构造一个该类的实例。这么做会比较耗费资源。

    如果能在jvm启动时就new好,或者是某一次new好后以后再也不用new了,这样就能节省很多资源了。

    这就是单例模式要解决的问题。

    # 单例实现步骤

    要实现一个单例类,需要经过三个步骤:

    1、私有化构造函数,目的是避免其它类可以创建这个类的对象;

    2、在本类中创建唯一实例对象(因为构造函数私有化了,所以单例类的唯一实例对象只能在单例类里面创建;),使用一个私有静态的成员变量保存

    3、对外提供一个公开的静态的函数供别人获取这个唯一实例对象

    #单例的两种实现方法:

    1)饿汉式

    特点:在加载类的同时就创建了这个类的唯一实例;

    好处:可保证这个类的实例的唯一性;

    弊端:如果只是使用这个类,但是暂时不需要它的对象,也会创建唯一实例,造成内存的浪费;

    代码模板:

    2)懒汉式:

    特点:在第一次调用获取实例的方法时才创建对象;

    好处:第一次调用获取实例的方法时才创建对象,可以避免内存的浪费;

    弊端:多线程环境下不能保证实例的唯一性;

    代码模板:

     

     上面两种是从人家博客里面截图的,比较清晰的说明了饿汉模式和懒汉模式的区别

     #单例模式的优点

    1)严格控制对唯一的实例的访问方式(可以允许有限数量的实例)

    2)仅有一个实例,可以节约系统资源

     #单例模式的缺点

    1)单例模式没有抽象层,扩展比较困难

    2)职责过重,即充当工厂角色,有充当产品角色。

    3)如果长期不使用,Java会自动回收,导致下次使用又重新实例化。

     #单例模式的特点

    1)有且仅有一个单例类实例(无法通过反序列化重新构建对象)

    2)构造函数私有化

    3)通过静态方法或枚举获得单例类实例

    #python实现单例模式

    #(1)
    class Test: def __new__(cls): if not hasattr(cls,'instance'): cls.instance=super(Test,cls).__new__(cls) return cls.instance obj1=Test() obj2=Test() print(obj1 is obj2) #(2) def singleton(cls): instances={} def getinstance(*args,**kwargs): if cls not in instances: instances[cls]=cls(*args,**kwargs) return instances[cls] return getinstance @singleton class MyClass: a=1 c1=MyClass() c2=MyClass() print(c1==c2)

     还有其他的,我也不想再写了

    什么是单例?为什么要用单例?

    一个类被设计出来,就代表它表示具有某种行为(方法),属性(成员变量),而一般情况下,当我们想使用这个类时,会使用new关键字,这时候jvm会帮我们构造一个该类的实例。而我们知道,对于new这个关键字以及该实例,相对而言是比较耗费资源的。所以如果我们能够想办法在jvm启动时就new好,或者在某一次实例new好以后,以后不再需要这样的动作,就能够节省很多资源了。


    作者:jsbintask22
    链接:http://www.imooc.com/article/279430
    来源:慕课网
    本文原创发布于慕课网 ,转载请注明出处,谢谢合作

    什么是单例?为什么要用单例?

    一个类被设计出来,就代表它表示具有某种行为(方法),属性(成员变量),而一般情况下,当我们想使用这个类时,会使用new关键字,这时候jvm会帮我们构造一个该类的实例。而我们知道,对于new这个关键字以及该实例,相对而言是比较耗费资源的。所以如果我们能够想办法在jvm启动时就new好,或者在某一次实例new好以后,以后不再需要这样的动作,就能够节省很多资源了。


    作者:jsbintask22
    链接:http://www.imooc.com/article/279430
    来源:慕课网
    本文原创发布于慕课网 ,转载请注明出处,谢谢合作

    #参考

    http://www.imooc.com/article/279430

     https://baijiahao.baidu.com/s?id=1619543284145447185&wfr=spider&for=pc

    http://www.sohu.com/a/141927148_812245

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/baxianhua/p/11419829.html
Copyright © 2020-2023  润新知