想写设计模式,是由于读完了《漫谈设计模式》,有颇多感触。python
将本身对于设计模式的理解记录下来,一方面防止本身遗忘,另外一方面也能够给新手们一些入门级的帮助。程序员
若是你要我给你一个看下去的理由的话,那么我只说四个字——浅显易懂。web
设计模式原本是一个很简单的东西,可是被专家们一总结一概括,就变成了一套一套的理论。sql
我以为对于新手来讲,最重要的是搞懂“是什么”和“为何”,至于更深层的东西,等你实践得多了天然就懂了。数据库
文中示例所用语言为python,简洁明了。设计模式
我的理解不免有些误差,若是有错误欢迎你们指出,我会及时改正的。安全
也欢迎你们提出各类意见建议。框架
重复一遍——浅显易懂。至于到底多浅显易懂,请往下看吧。性能
要查看本系列全部文章,请点击页面右侧“随笔分类”中的“设计模式”。学习
言归正传,先来看问题:
class sql_query(): # 用于进行数据库查询 def get_db(): # 链接数据库 ...... db = create_db_connection() ...... return db def run_query(sql): # 执行查询命令 db = get_db result = db.exec(sql) return result test = sql_query() print test.run_query("SELECT * FROM books;") print test.run_query("SELECT * FROM authors;")
很简单的一个数据库查询例子,咱们分析一下这个例子有什么问题。
运行了两条查询命令,每次运行都会先建立数据库链接而后执行命令。
也就是说若是咱们运行N条命令,就须要建立N次数据库链接。
咱们知道不管是网站仍是软件,响应速度都是很是重要的。而建立数据库链接自己就是一个很是费时的操做,因此这样的代码会致使很是严重的性能问题。
解决方法就是采用单例模式,不少人应该都听过这个名词,单例单例,就是只有一个实例。
看代码:
class sql_query(): # 用于进行数据库查询 def __init__(self): self.db = _get_db def _get_db(): # 链接数据库 ...... db = create_db_connection() ...... return db def run_query(sql): # 执行查询命令 result = self.db.exec(sql) return result test = sql_query() print test.run_query("SELECT * FROM books;") print text.run_query("SELECT * FROM authors;")
很简单,咱们把数据库链接db保存为实例变量,这样只会在建立实例的时候初始化一次db,以后就能够直接使用了。
上面的代码虽然已经能够用了,不过还能够进行一下改进:
class sql_query(): # 用于进行数据库查询 def __init__(self): self.db = None def _get_db(): # 链接数据库 ...... db = create_db_connection() ...... return db def run_query(sql): # 执行查询命令 if not self.db: self.db = _get_db() result = self.db.exec(sql) return result test = sql_query() print test.run_query("SELECT * FROM books;") print text.run_query("SELECT * FROM authors;")
看出区别了吗?咱们此次并无在建立实例的时候初始化数据库链接,而是在第一次进行查询的时候建立。
这样作的好处就是,咱们在真正须要运行查询的时候才建立链接,进一步提升了性能。
有几点须要注意:
下回咱们学习工厂方法。
最后,请回答这两个问题:
单例模式能解决什么问题?
单例模式是怎么解决这个问题的?