設計模式——單例模式
阿新 • • 發佈:2017-06-03
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()
總結:單利模式存在的目的是保證當前內存中僅存在單個實例,避免內存浪費!!!
設計模式——單例模式