写给新手的设计模式教程——单例模式

零、写在前面

 

想写设计模式,是由于读完了《漫谈设计模式》,有颇多感触。python

将本身对于设计模式的理解记录下来,一方面防止本身遗忘,另外一方面也能够给新手们一些入门级的帮助。程序员

若是你要我给你一个看下去的理由的话,那么我只说四个字——浅显易懂web

设计模式原本是一个很简单的东西,可是被专家们一总结一概括,就变成了一套一套的理论。sql

我以为对于新手来讲,最重要的是搞懂“是什么”和“为何”,至于更深层的东西,等你实践得多了天然就懂了。数据库

文中示例所用语言为python,简洁明了。设计模式

 

我的理解不免有些误差,若是有错误欢迎你们指出,我会及时改正的。安全

也欢迎你们提出各类意见建议。框架

 

重复一遍——浅显易懂。至于到底多浅显易懂,请往下看吧。性能

 

要查看本系列全部文章,请点击页面右侧“随笔分类”中的“设计模式”。学习

 

1、单例模式

 

言归正传,先来看问题:

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,以后就能够直接使用了。

 

2、小小改进

 

上面的代码虽然已经能够用了,不过还能够进行一下改进:

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;")

看出区别了吗?咱们此次并无在建立实例的时候初始化数据库链接,而是在第一次进行查询的时候建立。

这样作的好处就是,咱们在真正须要运行查询的时候才建立链接,进一步提升了性能。

 

3、注意事项

 

有几点须要注意:

  • 生产环境使用单例的时候,记得最后要close数据库链接。
  • Python并无真正意义上的“私有”元素,我我的以为其实也不必。提供统一接口已经能够保证封装了。至于防止外部修改,我以为更应该从软件之外来规定,这不是程序员应该考虑的问题。
  • 单例的典型例子就是数据库链接,不过单例并不仅能应用于数据库链接,但愿你们好好把握单例的这种思想。
  • 原书中单例部分还涉及到了线程安全,不过我是搞web开发的,这个问题框架会解决,这里不深刻讨论。

 

下回咱们学习工厂方法。

 

最后,请回答这两个问题:

单例模式能解决什么问题?

单例模式是怎么解决这个问题的?

相关文章
相关标签/搜索