Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is a Ruby factory method?

I understand that a factory method is a class method that utilises the self keyword and instantiates an object of it's own class. I don't understand how this is useful or how it can extend the functionality of initialize method.

I'm working on a project creating a command line address book that asks me to use a factory pattern on the Person class so that I can create a Trainee or Instructor (subclasses) with different attributes.

like image 372
Danny Santos Avatar asked May 21 '16 14:05

Danny Santos


2 Answers

A factory class is a clean way to have a single factory method that produces various kind of objects. It takes a parameter, a parameter that tells the method which kind of object to create. For example to generate an Employee or a Boss, depending on the symbol that is passed in:

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

and then:

employee = PersonFactory.for(:employee, name: 'Danny')
boss = PersonFactory.for(:boss, name: 'Danny')
person = PersonFactory.for(:foo, name: 'Danny')

I also wrote a more detailed blog post about that topic: The Factory Pattern

like image 179
Christian Rolle Avatar answered Oct 11 '22 12:10

Christian Rolle


The Factory Method Pattern at least allows you to give an expressive name to what could otherwise be a complicated or opaque constructor. For instance if you have a constructor that takes a bunch of parameters, it may not be clear why to the caller, having a named Factory method or methods could potentially hide the complexity of the object creation and make your code more expressive of what is actually going on.

So in your case a bad design may be:

trainee = Person.new true

or

instructor = Person.new false

Where true or false branches to creating an instructor or trainee.

This could be improved by using a Factory method to clarify what is going on:

trainee = Person.create_trainee
instructor = Person.create_instructor
like image 29
Mike K. Avatar answered Oct 11 '22 12:10

Mike K.