June 13th, 2010

通过动态导入实现工厂模式

, python, by zay.

忘记曾经在哪里看到过这样的一句话,文件的命名是相当的重要的,在开发的过程,程序员应该充分利用这一强大的功能.大概意思是这样吧,由于最近大脑萎缩得厉害很多东西记不住.

现在发一份关于使用文件名而实现工厂模式的文章,希望大家都能过来踩踩.实现语言是使用python

文件如下:

—-main.py

—-infactory

—-Bfactory

—-Afactory

功能: 通过main.py生成Afactory和Bfactory实例,如果看过head first 设计模式的话,可以知道传统的工厂模式实现说白了就是在另外一个内使用if,else来控制传入的参数在生成实例.现在我使用python的动态导入功能来实现这一功能,核心的一个语句就是 __import__(param, globals(), locals(), [param], -1).

接下来我先post出我的main.py是怎么写的:

def instanceFactory(param):

try:

temp = __import__(param, globals(), locals(), [param], -1)

instance=temp.factory()

instance.tostring()

except:

print param+” not found!”

def main():

instanceFactory(’Afactory’)

instanceFactory(’Bfactory’)

infactory.py:

class infactory:

def create(self):

pass

def tostring(self):

pass

Afactory.py:

from infactory import infactory

class factory(infactory):

def create(self):

print ‘A factory!’

def tostring(self):

print ‘A factory!’

Bfactory.py:

from infactory import infactory

class factory(infactory):

def create(self):

print ‘B factory!’

def tostring(self):

print ‘B factory!’

但是这样有个瑕疵就是Bfactory.py和Afactory.py里面的类名是相同的,因为 temp = __import__(param, globals(), locals(), [param], -1)这条语句的作用只是import了Bfactory.py和Afactory.py并没有进行实例,如果是使用Java的话可以使用class.forname(),所以只好折中将AB的类名都命名为factory,然后加入instance=temp.factory()进行实例.懒得折腾wp的排版有兴趣的朋友可以download完整的源代码,如下:

https://zaysky.googlecode.com/svn/trunk/design/infactory.rar

Back Top

分享下Don’t Repeat Yourself的想法 华中科技大学2010届本科毕业典礼上根叔的讲话

Responses to “通过动态导入实现工厂模式”

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Back Top