Python与工厂模式
我好像没能理解工厂模式的正确概念。
有没有人能帮我写一个简单的测试?我在网上看了一些资料,但就是无法按照那样来编码。其实我不明白这个过程。复制代码很简单,但我需要明白为什么这样做不行。
class Factory:
def __init__(self):
self.msg = "teste"
def fabricateAnotherObject(self,obj,**kwargs):
return apply(obj,**kwargs)
class testClass:
def __init__(self,nome,salario,endereco):
self.nome = nome
self.salario = salario
self.endereco = endereco
def __str__(self):
return "Nome: " + str(self.nome) + "\nEndereco: " + str(self.endereco) + "\nSalario: " + str(self.salario)
a = Factory()
emp = a.fabricateAnotherObject(testClass,"George",2000,"Three Four Five Avenue")
print str(emp)
4 个回答
另请参见 type() 在 docs.python.org/library/functions 中:
type(name, bases, dict)
这个函数会返回一个新的类型对象。简单来说,它是类声明的一种动态形式。这里的 name 是类的名字,它会变成 __name__ 属性;bases 是一个元组,列出了基类,它会变成 __bases__ 属性;而 dict 是一个字典,里面包含了类的定义内容,它会变成 __dict__ 属性。
举个例子,下面这两条语句创建的类型对象是一样的:
class X(object):
a = 1
X = type('X', (object,), dict(a=1))
如果你想看一个简短的实际程序,里面用到了工厂(快速创建很多特殊字典),可以看看 ofc2.py 。
专家们,有更多例子吗?
工厂模式是为了那些不允许将函数(和类)作为第一类值的编程语言设计的,比如C++或Java。
这个模式的意思是,你可以把一个“工厂”类的实例作为参数传递给某个函数(或者方法、构造函数),然后这个工厂就可以用来生成新的对象实例(通常这些对象是某个已知父类的特定子类的实例)。
而在Python中,你可以直接传递类本身(因为在Python中,类和函数也是对象)。
你的代码其实是适得其反的(抱歉,我必须这么说)。
工厂模式的意思是,你在创建对象的时候,不需要知道你要创建的对象具体是什么类。
原因在于,创建对象会让面向对象的抽象变得复杂。你在创建对象的时候必须具体,但有时候你只想创建一个有特定行为的对象,而具体的类应该由其他地方来决定。
举个例子,你可能在100个地方都需要创建同一种对象。但后来你发现需要更改这个对象的类,那你就得在所有这些地方都去修改。
使用工厂模式可以避免这种麻烦,因为你只需要在一个地方进行修改。
最简单的工厂模式是:
def fabricateAnotherObject(self, **kwargs):
return testClass(**kwargs)
当然,这在某些情况下可能帮助不大。所以有些工厂可能会从数据库或其他配置中加载类名。但最简单的解决方案是直接在代码中写死对象的构造方法——在我们的例子中,只有这个方法需要在你决定总是调用它的时候进行修改。
一个稍微动态一点的解决方案(不需要数据库):
class Factory(object):
def __init__(self, theClass):
self.theClass = theClass
def create(self, **kwargs):
self.theClass(**kwargs)
myFactory = Factory(testClass)
myFactory实例可以在不同的地方用来创建正确的实例。问题是,如何初始化myFactory——是在某个特殊的模块中吗?