题
我似乎无法把握工厂的适当的概念。
谁能帮我编写一个简单的测试?我读了互联网和斜面代码用同样的方式一些文本。其实我无法理解的过程。复制代码很容易,但我需要了解为什么这不会工作。
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)
解决方案
您的代码是适得其反(对不起,我必须说,它)。
工厂的感觉是,你不必知道你的类构造对象的在您创建它的位置。
的原因是,该对象的创建创建在面向对象的抽象的间隙。您必须在创建对象混凝土。但有时你只是想创造一些行为,但别人要决定(中央)的对象是什么具体的类。
例如,你必须在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 - 在一些特殊的模块??
其他提示
厂模式旨在用于编程语言不允许函数(和类)作为一阶值(如C ++或Java)。
的想法是,你传递一个“工厂”类的实例作为参数传递给一些函数(或方法或构造),然后将其用于产生新的对象实例(通常这些是的一些特定的子类的实例在预先已知的超类)。
在Python,则可以只是通过类,而不是(因为类(和功能)也是对象)。
您编造方法应该是这样的:
def fabricateAnotherObject(self, obj, *args):
return apply(obj, args)
应用()采用在args的列表。通过采取在* ARGS在fabricateAnotherObject方法,你消耗超出OBJ所有参数可以传递到应用()的列表。
参见类型() 在docs.python.org/library/functions:
类型(名称,碱,字典)
返回一个新的类型的对象。这基本上是类声明的动态形式。 该名字符串类名,成为__name__属性; 基座元组逐条列出的基类和成为__bases__来得到的属性; 和字典的字典是包含用于类定义体的命名空间 并成为__dict__属性。 例如,以下两个语句创建相同类型的对象:
class X(object):
a = 1
X = type('X', (object,), dict(a=1))
有关与一个利用工厂(紧凑地构建大量特殊类型的字典)的短真正的程序,参见 ofc2.py 。结果 专家,更多的例子请?