mzh/blog

跟着Django学设计模式[1]

Django作为传说中的又大又重的开源项目,自然而然地使用了很多优秀的设计模式,就让我们看看Django吸收了哪些优秀的设计模式吧。如果没有特殊说明,本文的Django均指Django 1.6 创建模式中Django使用了:

工厂方法模式

最著名的就是inlineformset_factory这函数。 应用场景是这样的:假设有两个Model:Book和Author。Book有外键指向Author,这时,如果需要写个关于Author和Book的model表单组(model formset)时,顿时头疼了有没有,要判断Author是否是新创建的,Book的外键是否符合限制条件等等问题……重新写一个form把它们组合起来?太费事了 BookFormSet = inlineformset_factory(Author, Book) 搞定收工。 这就是工厂方法,根据给定参数产出新的类。

惰性初始模式

用过Django的人都知道settings很重要,但是每次遇到 from django.conf import settings 时,有没有人好奇地看看这个对象到底是什么呢

In [1]: from django.conf import settings

In [2]: type(settings)
Out[2]: django.conf.LazySettings

怎么算个惰性对象呢? 假设我们有个需要挺多时间才能得到结果的函数sleepy

def sleepy():
    import time
    time.sleep(3)
    print "Slept 3 seconds"
    return True

直接调用sleepy肯定是会等上3秒才有结果的,而当settings里面引入这个函数,

SLEEPY=sleepy()

from django.conf import settings时并没有暂停3秒,而是调用settings.SLEEPY时才会暂停。 也就是说,你要是永远不用settings.SLEEPY的话,这个函数就永远不会执行,这就是懒–>惰性初始模式啦

小结

Django最常见的设计模式,

大家应该是经常用的了,只是没有注意到这是”设计模式”,充分证明了”大道至简”,Django简化到了大家都没注意到的地步,可真是成功啊!