我似乎无法掌握工厂的正确概念。
任何人都可以帮我编写一个简单的测试代码吗?我通过互联网阅读了一些文本,并且无法用同样的方式编写代码。其实我无法理解这个过程。复制代码很简单,但我需要了解为什么这不起作用。
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)
答案 0 :(得分:13)
你的代码适得其反(对不起,我必须说出来)。
工厂的意义是,您不必在创建它的位置知道构造对象的类。
原因是,对象创建在面向对象的抽象中创造了一个空白。你必须具体创建对象。但有时你只想创建一个具有某种行为的对象,但是其他人应该(集中)决定它是什么具体的类。
例如,您必须在100个地方创建一种对象。但是后来你可能会发现,你必须改变课程 - 你必须改变所有这些地方。
工厂将通过定义您必须更改的一个地方来消除这种需求。
最简单的工厂是:
def fabricateAnotherObject(self, **kwargs):
return testClass(**kwargs)
当然,在某些情况下这可能没什么帮助。因此,一些工厂也可能从db或其他配置加载类名。但最简单的解决方案是对象的硬编码构造 - 当您选择始终调用此方法时,只有在我们的示例中必须更改此方法。
更动态的解决方案(不需要db):
class Factory(object):
def __init__(self, theClass):
self.theClass = theClass
def create(self, **kwargs):
self.theClass(**kwargs)
myFactory = Factory(testClass)
可以在不同位置使用myFactory实例来创建正确的实例。问题是,如何初始化myFactory - 在某些特殊模块中?
答案 1 :(得分:5)
工厂模式适用于不允许函数(和类)作为一阶值(例如C ++或Java)的编程语言。
这个想法是你将一个“工厂”类的实例作为参数传递给某个函数(或方法或构造函数),然后用它来生成新的对象实例(通常这些是一些特定子类的实例)事先知道的超类。)
在Python中,你可以改为传递类(因为类(和函数)也是对象)。
答案 2 :(得分:0)
您的制作方法应如下所示:
def fabricateAnotherObject(self, obj, *args):
return apply(obj, args)
apply()接受一个args列表。通过在fabricateAnotherObject方法中引入* args,可以使用obj之外的所有参数作为可以传递给apply()的列表。
答案 3 :(得分:0)
另见type() 在docs.python.org/library/functions中:
类型(名称,基数,字典)
返回一个新类型对象。这实际上是类语句的动态形式。 名称字符串是类名,并成为__name__属性; 基元元组列出基类并成为__bases__属性; dict字典是包含类体定义的命名空间 并成为__dict__属性。 例如,以下两个语句创建相同的类型对象:
class X(object):
a = 1
X = type('X', (object,), dict(a=1))
对于一个使用工厂的简短实际程序(紧凑地构建许多特殊的dicts),请参阅
ofc2.py。
专家,更多例子吗?