單例模型

設計模式

1、單例模式

單例,顧名思義單個實例。html

Python的面向對象由兩個很是重要的兩個「東西」組成:類、實例python

面向對象場景一:web

  • 蒼井井,女,18,初始戰鬥力1000sql

  • 東尼木木,男,20,初始戰鬥力1800數據庫

  • 波多多,女,19,初始戰鬥力2500設計模式

    ##################### 定義類 #####################
    class Person:併發

    def __init__(self, na, gen, age, fig):
           self.name = na
           self.gender = gen
           self.age = age
           self.fight =fig
    
       def grassland(self):
           """註釋:草叢戰鬥,消耗200戰鬥力"""
    
           self.fight = self.fight - 200

    ##################### 建立實例 #####################fetch

    cang = Person('蒼井井', '女', 18, 1000) # 建立蒼井井角色
    dong = Person('東尼木木', '男', 20, 1800) # 建立東尼木木角色
    bo = Person('波多多', '女', 19, 2500) # 建立波多多角色url

面向對象場景二:設計

如:建立對數據庫操做的公共類

  • #### 定義類 ####

    class DbHelper(object):

    def __init__(self):
           self.hostname = '1.1.1.1'
           self.port = 3306
           self.password = 'pwd'
           self.username = 'root'
    
       def fetch(self):
           # 鏈接數據庫
           # 拼接sql語句
           # 操做
           pass
    
       def create(self):
           # 鏈接數據庫
           # 拼接sql語句
           # 操做
           pass
    
       def remove(self):
           # 鏈接數據庫
           # 拼接sql語句
           # 操做
           pass
    
       def modify(self):
           # 鏈接數據庫
           # 拼接sql語句
           # 操做
           pass

    #### 操做類 ####

    db = DbHelper()
    db.create()

實例:結合場景二實現web應用程序

#!/usr/bin/env python
    #coding:utf-8
    from wsgiref.simple_server import make_server
    
    
    class DbHelper(object):
    
        def __init__(self):
            self.hostname = '1.1.1.1'
            self.port = 3306
            self.password = 'pwd'
            self.username = 'root'
    
        def fetch(self):
            # 鏈接數據庫
            # 拼接sql語句
            # 操做
            return 'fetch'
    
        def create(self):
            # 鏈接數據庫
            # 拼接sql語句
            # 操做
            return 'create'
    
        def remove(self):
            # 鏈接數據庫
            # 拼接sql語句
            # 操做
            return 'remove'
    
        def modify(self):
            # 鏈接數據庫
            # 拼接sql語句
            # 操做
            return 'modify'
    
    
    class Handler(object):
    
        def index(self):
            # 建立對象
            db = DbHelper()
            db.fetch()
            return 'index'
    
        def news(self):
            return 'news'
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        temp = url.split('/')[1]
        obj = Handler()
        is_exist = hasattr(obj, temp)
        if is_exist:
            func = getattr(obj, temp)
            ret = func()
            return ret
        else:
            return '404 not found'
    
    if __name__ == '__main__':
        httpd = make_server('', 8001, RunServer)
        print "Serving HTTP on port 8001..."
        httpd.serve_forever()

對於上述實例,每一個請求到來,都須要在內存裏建立一個實例,再經過該實例執行指定的方法。

那麼問題來了...若是併發量大的話,內存裏就會存在很是多功能上如出一轍的對象。存在這些對象確定會消耗內存,對於這些功能相同的對象能夠在內存中僅建立一個,須要時都去調用,也是極好的!!!

經過面向對象的特性,構造出單例模式:

########### 單例類定義 ###########
class Foo(object):
 
    __instance = None
 
    @staticmethod
    def singleton():
        if Foo.__instance:
            return Foo.__instance
        else:
            Foo.__instance = Foo()
            return Foo.__instance
 
########### 獲取實例 ###########
obj = Foo.singleton()

對於Python單例模式,建立對象時不能再直接使用:obj = Foo(),而應該調用特殊的方法:obj = Foo.singleton() 。

#!/usr/bin/env python
    #coding:utf-8
    from wsgiref.simple_server import make_server
    
    ########### 單例類定義 ###########
    class DbHelper(object):
    
        __instance = None
    
        def __init__(self):
            self.hostname = '1.1.1.1'
            self.port = 3306
            self.password = 'pwd'
            self.username = 'root'
    
        @staticmethod
        def singleton():
            if DbHelper.__instance:
                return DbHelper.__instance
            else:
                DbHelper.__instance = DbHelper()
                return DbHelper.__instance
    
        def fetch(self):
            # 鏈接數據庫
            # 拼接sql語句
            # 操做
            pass
    
        def create(self):
            # 鏈接數據庫
            # 拼接sql語句
            # 操做
            pass
    
        def remove(self):
            # 鏈接數據庫
            # 拼接sql語句
            # 操做
            pass
    
        def modify(self):
            # 鏈接數據庫
            # 拼接sql語句
            # 操做
            pass
    
    
    class Handler(object):
    
        def index(self):
            obj =  DbHelper.singleton()
            print id(single)
            obj.create()
            return 'index'
    
        def news(self):
            return 'news'
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        temp = url.split('/')[1]
        obj = Handler()
        is_exist = hasattr(obj, temp)
        if is_exist:
            func = getattr(obj, temp)
            ret = func()
            return ret
        else:
            return '404 not found'
    
    if __name__ == '__main__':
        httpd = make_server('', 8001, RunServer)
        print "Serving HTTP on port 8001..."
        httpd.serve_forever()
相關文章
相關標籤/搜索