1. 程式人生 > >設計模式——單例模式

設計模式——單例模式

pre hostname turn cin user order 總結 -type path_info

單例模式

實例: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()

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

那麽問題來了...如果並發量大的話,內存裏就會存在非常多功能上一模一樣的對象。存在這些對象肯定會消耗內存,對於這些功能相同的對象可以在內存中僅創建一個,需要時都去調用,也是極好的!!!

鐺鐺 鐺鐺 鐺鐺鐺鐺鐺,單例模式出馬,單例模式用來保證內存中僅存在一個實例!!!

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # ########### 單例類定義 ########### 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()

總結:單利模式存在的目的是保證當前內存中僅存在單個實例,避免內存浪費!!!

設計模式——單例模式