我似乎无法把握工厂的适当的概念。

谁能帮我编写一个简单的测试?我读了互联网和斜面代码用同样的方式一些文本。其实我无法理解的过程。复制代码很容易,但我需要了解为什么这不会工作。

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 。结果 专家,更多的例子请?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top