面向对象之单例模式(代码片段)

hades123 hades123     2022-12-22     387

关键词:

1. 单例模式

1.1 什么是单例模式

  • 单例模式就是基于某种方法实例化多次得到的示例是同一个
class Foo():
    def __init__(self,name, age):
        self.name = name
        self.age = age
        
f1 = Foo('hades',13)
print(f1)
f2 = Foo('hades',13)
print(f2)
f3 = Foo('hades',13)
print(f3)
<__main__.Foo object at 0x0000023CB56AD518>
<__main__.Foo object at 0x0000023CB56AD550>
<__main__.Foo object at 0x0000023CB5688048>

上面演示的就不属于单例模式,虽然看起来实例化对象一摸一样,但从内存地址就能看出,其实都是单独的对象

1.2 为什么用单例模式

  • 当实例化多次得到的对象存放的属性都是一样的时候,我们就没必要去占用更多的内存空间,实例化对象指向同一个内存

  • 最终目的就是省内存

1.3 单例模式三种方式

1.3.1 使用类内部绑定方法特性,定义静态方法

NAME = 'hades'
AGE = 27

class People:
    __instance = None
    
    def __init__(self,name,age):
        self.name = name 
        self.age = age
        
    @classmethod
    def from_conf(cls):
        if cls.__instance:
            return cls.__instance
        
        cls.__instance = People.__init__(cls,NAME,AGE)
        return cls.__instance
        
p1 = People.from_conf()
p2 = People.from_conf()
print(p1==p2)
True

1.3.2 利用装饰器实现单例模式

NAME = 'hades'
AGE = 27

def deco(cls):
    cls.__instance = cls(NAME,AGE)
    
    def wrapper(*args,**kwargs):
        if len(args) == 0 and len(kwargs) == 0:
            return cls.__instance
        
        res = cls(*args,**kwargs)
        return res
    
    return wrapper

@deco
class People():
    
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
p1 = People()
p2 = People()
p3 = People('bonnie',16)
print(p1 == p2)
print(p1 == p3)
True
False

1.3.3 利用元类实现单例模式

NAME = 'hades'
AGE = 27

class Mymeta(type):
    def __init__(self, class_name, class_bases, class_dict):
        super().__init__(class_name, class_bases, class_dict)
        
        self.__instance = self(NAME, AGE)
        
    def __call__(self, *args, **kwargs):
        
        if len(args) == 0 and len(kwargs) == 0:
            return self.__instance
        
        obj = self.__new__(self)
        self.__init__(obj, *args, **kwargs)
        
        return obj
        
class People(metaclass=Mymeta):
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
p1 = People()
p2 = People()
p3 = People('bonnie',16)
print(p1 == p2)
print(p1 == p3)
True
False

设计模式之单例模式(代码片段)

...类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。作用(解决的问题):保证1个类只有1个对象,降低对象之间的耦合度优点:1、提供了对唯一实例的受控访问;2、由于在系统内存中只存在一个对象,因此... 查看详情

设计模式之单例模式(代码片段)

一、理解单例模式  确保类有且只有一个特定类型的对象,并提供全局访问点,单例模式通常用于下列情形,例如日志记录或数据库操作等,避免对同一资源请求的相互冲突。单例的模式的意图如下:确保类有且只有一个对象... 查看详情

折腾java设计模式之单例模式(代码片段)

...洁点理解就是涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问它自己唯一的对象的方式,可以直接访问,不需要实例化该类的对象。饿汉式 查看详情

23种设计模式之单例模式(代码片段)

...类必须自己创建自己的唯一的实类单例类必须给其他所有对象提供这一实例 在计算机系统中,线程池,缓存,日志对象,打印机,对话框常常被设计成单例对象。选择单例模式就是为了避免不一致状态。一、懒汉式publicclassS... 查看详情

23种设计模式之单例模式(代码片段)

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在... 查看详情

揭秘设计模式之单例模式(代码片段)

...局访问点。属于创建型模式。单例就是一个类只能有一个对象,单例模式在生活里也比较普遍,比如:像打印机、处理器(单核)、皇帝、太子、月亮、太阳等等,它们都是稀有资源,只能有一个实例对象。代码案例饿汉式packag... 查看详情

java设计模式之单例模式与工厂模式(代码片段)

...的大学生,CSDN内容合伙人✨精品专栏:C++面向对象🔥系列专栏:JavaSE精品总结文章目录  前言1、设计模式概念及分类2、单例模式2.1、饿汉式2.2、懒汉式2.2.1、懒汉式进阶版2.2.2、懒汉式之懒加载3、工厂... 查看详情

设计模式之单例模式(代码片段)

...(Singleton): 保证整个应用中某个实例有且只有一个 有些对象我们只需要一个: 配置文件, 工具类, 线程池, 缓存, 日志对象等.如果创造出多个实例就会导致训多问题: 比如占用过多资源 查看详情

java之单例模式(代码片段)

...ssSingleton //1.将构造方法私有化,不允许外部直接创建对象 privateSingleton() //2.创建类的唯一实例,使用privatestatic变为类的静态成员 privatestaticSingletoninstance=newSingleton(); //3.提供一个可以获取 查看详情

设计模式创建型模式之单例模式(代码片段)

...,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。简单的理解:保证这一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对... 查看详情

我是皇帝我独苗之单例模式(代码片段)

...统提供这个实例。通俗一点就是确保一个类只能产生一个对象,所有对象对他的依赖都是相同的。?单例模式的几种实现方式?懒汉式(线程不安全)?publicclassSingletonprivatestaticSingletonsingleton;privateSingleton()publicstaticsynchronizedSi 查看详情

设计模式之单例模式(代码片段)

设计模式之单例模式Intro一个类只允许创建唯一一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。单例模式可能是大家听说最多的设计模式了,网上介绍最多的设计模式大概... 查看详情

javascript设计模式--创建型设计模式之单例模式(代码片段)

...来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVASCRIPT代码,代码只是实现了设计模式的主体功能,不代表全部的正确,特此声明。若读者需要了 查看详情

设计模式之单例模式(代码片段)

...汉式实现三1、加载时机2、线程安全一、概念JVM中,单例对象只有一个实例存在。二、饿汉式实现publicclassSingletonprivatestaticSingletoninstance=newSingleton();privateSingleton()publicstaticSingle 查看详情

设计模式之单例模式(代码片段)

...的一个类,在整个应用程序执行期间只有唯一的一个实例对象。主要实现方式包括饿汉式、懒汉式;懒汉式需要注意线程安全问题。核心是理解synchronize和volatile关键字。/***饿汉模式*/publicclassSingletonprivatestaticvolatileSinglet 查看详情

设计模式之单例模式c++实现(代码片段)

...例化该类。2、提供一个获得实例的接口。任何使用该类对象的地方,都通过这个接口获得该对象实例。在这个接口中确保只实例化一个对象。一般是如果对象不存在,实 查看详情

设计模式之单例模式(代码片段)

...思义就是只存在一个实例,也就是系统代码中只需要一个对象的实例应用到全局代码中,有点类似全局变量。例如,在系统运行时,系统需要读取配置文件中的参数,在设计系统的时候读取配置文件的类往往设计成单例类。因为... 查看详情

gof设计模式之单例模式(代码片段)

...给外部调用。比较适用调用和销毁频繁的类、一些工具类对象、创建时耗时或者占用资源又不得不用的类、一些访问频繁的数据库和文件对象。其五种写法一、懒汉式publicclassSingleton //类初始化时 查看详情