zoukankan      html  css  js  c++  java
  • 第二十篇 设计模式之单例模式

    1、当所有实例中封装的数据相同的时候,才适用于单例模式

    2、静态方法+静态字段

    单例模式作用:节省内存,单例模式保证内存中存在一个实例

    下面就是结合单例模式实现的web应用程序

     1 from wsgiref.simple_server import make_server
     2 class ConnectionPool:
     3     __instance = None
     4     def __init__(self):
     5         self.ip = "1.1.1.1"
     6         self.port = 3306
     7         self.pwd = "123"
     8         self.username = "xxxx"
     9        #去连接
    10         self.conn_list = [1,2,3,4,5,6,7,8,9,10]
    11     @staticmethod
    12     def get_instance():
    13         #这里判断是否有值,如果有就执行没有else
    14         if ConnectionPool.__instance:
    15             return ConnectionPool.__instance
    16         else:
    17             #创建一个对象,并将对象赋值给静态字段__instance
    18             ConnectionPool.__instance = ConnectionPool()
    19             return ConnectionPool.__instance
    20     def get_connection(self):
    21         # 获取连接
    22         import random
    23         r = random.randrange(1,11)
    24         return r
    25 def index():
    26     p = ConnectionPool.get_instance()
    27     conn = p.get_connection()
    28     return "IIII" + str(conn)
    29 def new():
    30     return "nnn"
    31 def RunServer(environ, start_response):
    32     start_response('200 OK', [('Content-Type', 'text/html')])
    33     #接收用户的url
    34     url = environ['PATH_INFO']
    35     if url.endswith("index"):
    36         ret = index()
    37         return ret
    38     elif url.endswith("new"):
    39         ret = new()
    40         return ret
    41     else:
    42         return "404"
    43 if __name__ == '__main__':
    44     httpd = make_server('', 800, RunServer)
    45     print "Serving HTTP on port 800..."
    46     #这里有一个循环死循环,只要客户端请求就会执行Runserver函数
    47     httpd.serve_forever()

    分析核心:

    class ConnectionPool:
        __instance = None
        def __init__(self):
            self.ip = "1.1.1.1"
            self.port = 3306
            self.pwd = "123"
            self.username = "xxxx"
           #去连接
            self.conn_list = [1,2,3,4,5,6,7,8,9,10]
    
        @staticmethod
        def get_instance():
            #这里判断是否有值,如果有就执行没有else
            if ConnectionPool.__instance:
                return ConnectionPool.__instance
            else:
                #创建一个对象,并将对象赋值给静态字段__instance
                ConnectionPool.__instance = ConnectionPool()
                return ConnectionPool.__instance
    
    
    obj1 = ConnectionPool.get_instance()
    print(obj1)
    obj2 = ConnectionPool.get_instance()
    print(obj2)
    流程:静态方法需要类去执行,去判断直接跳过if,执行else,ConnectionPool()就是执行init方法,而ConnectionPool()赋值的时候是一个对象,即ConnectionPool.__instance =obj,这个时候静态节点值发生变化。之后再次判断最后得到obj。这里无论再有多少个对象,对象封装的数据是相同的也就是单例模式
    对于单例模式不能够再用obj = Foo(),而是特殊方法obj = ConnectionPool.get_instance()

    执行得到的结果如下:
     1 <__main__.ConnectionPool object at 0x000001255F77C860>
    2 <__main__.ConnectionPool object at 0x000001255F77C860>
     
    可见每个访问的对象在我内存中都是相同的,如果不用单例模式,在大并发的情况下服务器会直接宕机
  • 相关阅读:
    java 字符串split有很多坑,使用时请小心!!
    Java并发编程:线程池的使用
    java自带线程池和队列详细讲解
    merge into的用法
    Oracle中如何使用REGEXP_SUBSTR函数
    oracle分组统计某列逗号隔开数据
    oracle一列中的数据有多个手机号码用逗号隔开,我如何分别取出来?
    css box-shadow使用---转
    201706问题记录
    201705问题记录
  • 原文地址:https://www.cnblogs.com/pyrene/p/6414718.html
Copyright © 2011-2022 走看看