# python_design_pattern **Repository Path**: duoduo3_69/python_design_pattern ## Basic Information - **Project Name**: python_design_pattern - **Description**: python 与设计模式 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2013-11-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README python 与设计模式 ==== zarkpy里面运用了很多设计模式,以前一直很费解python是怎么应用 设计模式的,他没有接口,也不是编译行的语言。直到sdjl(zarkpy 的原创者)对我说: > 设计模式只是参考,重要的是自己写一些东西。 学习的过程中有一些思考,因此记录在这里。 这些原理性的东西也可以运用到别的一些动态语言中去,javascript 则有一本《JavaScript设计模式》可以参考。 ###此处之后为v001版本代码 git checkout v001 Dao ---- dao/*.py 如果你熟悉java,自然会知道java里面有dao这个模式(Data Access Object), 继承自dao的类有数据库交互的能力。 对于python来说,你可以把dao命名为model(Django)等别的名字。 dao这个类应该是单例的,它类似于一个工具类,想象一下,如果有个User 类,你可能需要对user对象进行get,insert,delete,remove(增删改查), 这时是user对象与数据库之间的交互(把user这条记录扔到数据库里), user对象的状态在交互过程中是不应该改变的。 单例模式实际上就是使用缓存。 ---- java中使用static这种类加载的方式,将对象缓存在这里, 在编译执行的时 候确保对象是真正的单例。 public class Singleton { private static Singleton uniqueInstance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return uniqueInstance; } } 约定优于配置 --- rail 里面有句话是这样说的,约定优于配置(当然java也有这些东西, 想象下每个java bean里面那一堆getter setter吧,可以试试lombok), 在python里面可以使用工厂模式加缓存的方法,实现单例, 具体请看DaoFactory的实现方式,这里还用到了python里面模块加载 的一些技巧,参见helper.py与dao/__init__.py。 工厂模式 --- DaoFactory.py 为什么要使用工厂模式呢?为了减少一堆'import XXX,m = XXX()'等 代码的编写吧。对于java来说则是new的操作。 工厂模式就是可以通过传进来的字符串参数来生成对象,当然可以创建 不同的工厂来满足不同的需求,例如对于dao模块我创建了一个工厂是 dao_factory,结合缓存实现了单例,这样用户在调用的时候每次生成的 就会是同一个对象。 ipython -i DaoFactory.py u1 = dao_factory("User") u2 = dao_factory("User") u1 == u2 # True 工厂加缓存实现的单例模式,应该就是spring所做的事情(笔者并没有 看spring 的源码,猜测)。 ###此处之后为v002版本代码 git checkout v002 装饰者模式 --- modeldecorator/* 装饰者模式是一个非常棒的设计模式,他能在不改变基类代码的情况下 动态的添加一些功能,与之前的工厂模式结合,就会实现一行代码添加 一个功能的效果,这也是zarkpy里面装饰者的设计。 装饰者模式本身会有一个被装饰者对象的引用,保持原来接口的情况下 动态添加一些功能,然后再重新调用被装饰者原来的方法,达到一种添 加效果的功能。