Sam Kong wrote:
> Hi!
> 
> Sometimes a class provides object instantiation methods other than new.
> See an example.
> 
> class Color
>     def initialize r, g, b
>         @r = r
>         @g = g
>         @b = b
>     end
> 
>     def to_s
>         "R: #{@r}, G: #{@g}, B: #{@b}"
>     end
> 
>     class << self
>         def red
>             new 255, 0, 0
>         end
> 
>         def blue
>             new 0, 0, 255
>         end
> 
>         def green
>             new 0, 255, 0
>         end
>     end
> end
> 
> puts Color.new(100, 120, 140)
> puts Color.red
> puts Color.blue
> 
> 
> Is this one of design patterns, or just a simple idiom?
> It's similar to a factory method pattern but it's not according to the
> definition.
> Is there any name for it?

Since you invoke a class's method "new" like any other method of any 
other object (no special syntax) you can say with some justification 
that all classes are basically factories.

IMHO your example is not optimal because it wastes resources.  Since 
Color is immutable anyway constants seem a better choice:

Color = Struct.new :r, :g, :b
class Color
   def to_s
     sprintf "R: 0x%02x, G: 0x%02x, B: 0x%02x", self.r, self.g, self.b
   end

   RED   = new 0xFF, 0x00, 0x00
   BLUE  = new 0x00, 0x00, 0xFF
   GREEN = new 0x00, 0xFF, 0x00
end

Kind regards

	robert