From: Robert Klemme Date: 2006-03-23T18:13:51+09:00 Subject: Re: Is this a kind of design patterns? Jim Weirich wrote: > Robert Klemme wrote: >> Sam Kong wrote: >>> end >>> def blue >>> 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 > > I was thinking along the same lines, but I do like the method interface > (e.g. Color.red over Color::RED). My suggestion would have been > something like: > > class Color > ... > class << self > def red > @red ||= new 255, 0, 0 > end > ... > end > end IMHO this is not thread safe. If you need the method interface, you could do something like class Color def self.method_missing(s,*a,&b) if a.empty? && b.nil? const_get s.to_s.upcase else super end end end :-) robert