Métodos Factoría

A veces se necesita mas de una forma de inicializar las instancias de una clase. Una manera simple de hacerlo es dando valores por defecto a los parámetros de initialize:

class Point
  def initialize(x, y, z = nil)
    @x,@y,@z = x,y,z
  end
end
Pero a menudo no es suficiente con esto. Necesitamos factory methods o métodos factoría para crear los objetos de nuestra clase.

Supongamos que queremos crear objetos Point bien en coordenadas cartesianas bien en coordenadas polares:

~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ cat -n CartAndPolar.rb 
     1  include Math
     2  class Point
     3    attr_accessor :x, :y
     4  
     5    def initialize(x, y)
     6      @x, @y = x,y
     7    end
     8  
     9    private_class_method :new
    10  
    11    def Point.cartesian(x,y)
    12      new(x,y)
    13    end
    14  
    15    def Point.polar(r,theta)
    16      new(r*cos(theta), r*sin(theta))
    17    end
    18  
    19    def r 
    20      sqrt(@x*@x+@y*@y)
    21    end
    22  
    23    def theta
    24      atan2(@y, @x)
    25    end
    26  end
    27  if __FILE__ == $0 
    28    p = Point.polar(1, PI/4)
    29    puts p.r, p.theta         # 1.0 0.785398
    30    q = Point.cartesian(1, 1) # 1 1
    31    puts q.x, q.y
    32  end
Al hacer new privado lo hacemos inaccesible a las clases cliente, de manera que las clases usuario de Point deberán de usar uno de los dos métodos factoría proveídos para construir un objeto Point.

~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ ruby CartAndPolar.rb 
1.0
0.785398163397448
1
1

Casiano Rodriguez León 2015-01-07