设计模式之单例模式

单例设计模式是怎么来的?
在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法使用得内存对象只创建一次,然后再随处使用呢?单例模式就是为了解决这个问题而产生的。

实现方式:
1、创建一个类静态字段(类变量)__instance
2、创建一个静态函数,通过函数的逻辑判断 __instance 是否已存在,如不存在就将对象值赋于__instance,即__instance = 类(),否则直接返回__instance,也即创建的对象都是一样的
3、使用单例模式创建对象时直接通过类调用静态函数创建即可

#普通模式
class A(object):
def __init__(self,name,male):
self.name = name
self.name = male #实例化多个对象
obj1 = A('ben','boy')
obj2 = A('min','girl')
obj3 = A('miao','boy')
##打印内存地址,可以看到内存地址都是不一样的
print id(obj1),id(obj2),id(obj3) #单例模式
class A(object):
__instance = None
def __init__(self,name,male):
self.name = name
self.name = male
@staticmethod
def create_obj():
if not A.__instance:
A.__instance = A('ben','boy')
return A.__instance
else:
return A.__instance #单例模式实例化多个对象
obj1 = A.create_obj()
obj2 = A.create_obj()
obj3 = A.create_obj()
##打印内存地址,可以看到内存地址都是一样的
print id(obj1),id(obj2),id(obj3)

普通模式与单例模式示例代码

result :

 >>> #普通模式
... class A(object):
... def __init__(self,name,male):
... self.name = name
... self.name = male
...
>>> #实例化多个对象
... obj1 = A('ben','boy')
>>> obj2 = A('min','girl')
>>> obj3 = A('miao','boy')
>>> ##打印内存地址,可以看到内存地址都是不一样的
... print id(obj1),id(obj2),id(obj3)
140230687882448 140230687882512 140230687882576
>>>
>>> #单例模式
... class A(object):
... __instance = None
... def __init__(self,name,male):
... self.name = name
... self.name = male
... @staticmethod
... def create_obj():
... if not A.__instance:
... A.__instance = A('ben','boy')
... return A.__instance
... else:
... return A.__instance
...
>>> #单例模式实例化多个对象
... obj1 = A.create_obj()
>>> obj2 = A.create_obj()
>>> obj3 = A.create_obj()
>>> ##打印内存地址,可以看到内存地址都是一样的
... print id(obj1),id(obj2),id(obj3)
140230687882832 140230687882832 140230687882832
>>>

python设计模式之单例模式(转)的更多相关文章

  1. python设计模式之单例模式(一)

    前言 单例模式是创建模式中比较常见和常用的模式,在程序执行的整个生命周期只存在一个实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python ...

  2. python设计模式之单例模式(二)

    上次我们简单了解了一下什么是单例模式,今天我们继续探究.上次的内容点这 python设计模式之单例模式(一) 上次们讨论的是GoF的单例设计模式,该模式是指:一个类有且只有一个对象.通常我们需要的是让 ...

  3. Python设计模式之单例模式

    1.由于语言的特性不同,设计模式的实现方式和实现难度也会不同 2.有的模式已经在语言内置了,比如迭代器模式. 3.单例模式可以直接用模块级变量来实现 4.普通工厂模式可以直接通过传入"类名& ...

  4. python设计模式之单例模式(一)

    单例设计模式的概念: 单例设计模式即确保类有且只有一个特定类型的对象,并提供全局访问点.一般我们操作数据库的时候为了避免统一资源产生互相冲突,创建单例模式可以维护数据的唯一性. 单例模式的特性: 确保 ...

  5. python设计模式之--单例模式

    python的单例模式就是一个类的实例只能自始自终自能创建一次.应用场景比如说数据库的连接池. #!/usr/bin/env python # coding=utf- class Foo(object ...

  6. Python设计模式中单例模式的实现及在Tornado中的应用

    单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def new(cls, *args): if not isinstan ...

  7. 【python 设计模式】单例模式

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某 ...

  8. python 设计模式之 单例模式

    单例模式是做为"全局变量"的替代品出现的.所以它具有全局变量的特点:全局可见.贯穿应用程序的整个生命期,保证在程序执行中,某个类仅仅存在一个实例,所以通常不希望类中的构造函数被调用 ...

  9. python 设计模式之单例模式 Singleton Pattern

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

随机推荐

  1. Java 类的加载机制

    1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

  2. 机器学习排序算法:RankNet to LambdaRank to LambdaMART

    使用机器学习排序算法LambdaMART有一段时间了,但一直没有真正弄清楚算法中的所有细节. 学习过程中细读了两篇不错的博文,推荐给大家: 梯度提升树(GBDT)原理小结 徐博From RankNet ...

  3. Perl文件名通配和文件查找

    在shell中使用*来对文件名进行通配扩展,在Perl中也同样支持文件名通配.而且perl中的glob通配方式和shell的通配方式完全一致,实际上perl的glob函数就是直接调用csh来通配的(如 ...

  4. Perl模块管理

    Perl模块管理 perl有自带的模块,还有第三方模块.自带的模块是随perl安装而安装好的,第三方模块需要从CPAN(Comprehensive Perl Archive Network)上下载并安 ...

  5. 使用.Net Core 2.1开发Captcha图片验证码服务

    更新后续篇:Captcha服务(后续1) 使用.Net Core 2.1开发Captcha验证码服务 开发工具:Visual Studio 2017 15.7.3 开发平台:64位 Windows 1 ...

  6. C#操作DataTable类

    一.DataTable简介 (1)构造函数 名称 说明 DataTable()  不带参数初始化DataTable 类的新实例 DataTable(string tableName) 用指定的表名初始 ...

  7. Font Awesome 供更精准的图标搜索

    https://www.thinkcmf.com/font/font_awesome/icon/address-book

  8. c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错

    如果一个对象的值为null,那么它调用扩展方法时会报错吗? Person p = null ; p.ExtendMethod(); 上述代码出现的情况不会报错,刚开始遇到这种情况时很纳闷,就去问了大牛 ...

  9. mysql表名作为参数传入存储过程

    有以下存储过程: CREATE DEFINER=`root`@`localhost` PROCEDURE `P_HoverTreePages`( ), ) , ), ), ), IN `SortTyp ...

  10. .net反编译的九款神器(转载)

    .net反编译的九款神器  转载来源: https://www.cnblogs.com/zsuxiong/p/5117465.html 本人搜集了下8款非常不错的.Net反编译利器: 1.Reflec ...