Python与工厂模式

5 投票
4 回答
6296 浏览
提问于 2025-04-15 15:32

我好像没能理解工厂模式的正确概念。

有没有人能帮我写一个简单的测试?我在网上看了一些资料,但就是无法按照那样来编码。其实我不明白这个过程。复制代码很简单,但我需要明白为什么这样做不行。

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 个回答

1

另请参见 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
专家们,有更多例子吗?

5

工厂模式是为了那些不允许将函数(和类)作为第一类值的编程语言设计的,比如C++或Java。

这个模式的意思是,你可以把一个“工厂”类的实例作为参数传递给某个函数(或者方法、构造函数),然后这个工厂就可以用来生成新的对象实例(通常这些对象是某个已知父类的特定子类的实例)。

而在Python中,你可以直接传递类本身(因为在Python中,类和函数也是对象)。

13

你的代码其实是适得其反的(抱歉,我必须这么说)。

工厂模式的意思是,你在创建对象的时候,不需要知道你要创建的对象具体是什么类。

原因在于,创建对象会让面向对象的抽象变得复杂。你在创建对象的时候必须具体,但有时候你只想创建一个有特定行为的对象,而具体的类应该由其他地方来决定。

举个例子,你可能在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——是在某个特殊的模块中吗?

撰写回答