我知道工厂方法是一种类方法,它利用self
关键字并实例化它自己的类的对象。我不明白这是如何有用的,或者它如何扩展initialize
方法的功能。
我正在创建一个创建命令行地址簿的项目,要求我在Person类上使用工厂模式,这样我就可以创建具有不同属性的Trainee或Instructor(子类)。
答案 0 :(得分:11)
工厂类是一种使用单个工厂方法生成各种对象的简洁方法。
它需要一个参数,一个参数告诉方法要创建哪种对象。例如,要生成Employee
或Boss
,具体取决于传入的符号:
class Person
def initialize(attributes)
end
end
class Boss
def initialize(attributes)
end
end
class Employee
def initialize(attributes)
end
end
class PersonFactory
TYPES = {
employee: Employee,
boss: Boss
}
def self.for(type, attributes)
(TYPES[type] || Person).new(attributes)
end
end
然后:
employee = PersonFactory.for(:employee, name: 'Danny')
boss = PersonFactory.for(:boss, name: 'Danny')
person = PersonFactory.for(:foo, name: 'Danny')
我还写了一篇关于该主题的更详细的博文:The Factory Pattern
答案 1 :(得分:1)
工厂方法模式至少允许您为一个复杂或不透明的构造函数赋予一个富有表现力的名称。例如,如果你有一个带有一堆参数的构造函数,可能不清楚为什么调用者,有一个命名的Factory方法或方法可能隐藏对象创建的复杂性并使你的代码更能表达实际的内容继续。
所以在你的情况下,一个糟糕的设计可能是:
trainee = Person.new true
或
instructor = Person.new false
创建教师或实习生的真假分支。
这可以通过使用Factory方法来澄清正在发生的事情来改进:
trainee = Person.create_trainee
instructor = Person.create_instructor