使用类方法定义类,该方法调用new,然后调用具有相同名称的类实例方法,这是什么模式?

时间:2014-02-17 05:26:43

标签: ruby design-patterns

我正在开发一个项目并发现了这种模式,请参阅我在下面模拟的片段。这是常用的设计模式之一吗?这样编码有什么好处?谢谢!

注意:这里的参数可以是其他类的实例,而不仅仅是通用值。

class Foo
  def self.do_something arg1, arg2
    new(arg1, arg2).do_something
  end

  def initialize arg1, arg2
    # set instance variables
    @var1 = arg1
    @var2 = arg2
  end

  def do_something
    # do something...
    return self
  end
end

我的项目中的两个例子:

  1. Resque的工人类

    class MyWorkers
    
      @q = 'my_queue'
    
      def self.enqueue(arg1, arg2)
        new(arg1, arg2).enqueue
      end
    
      def self.perform(arg1, arg2)
        new(arg1, arg2).perform
      end
    
      def initialize(arg1, arg2)
        @var1 = arg1
        @var2 = arg2
      end
    
      def enqueue
        Resque.enqueue(self.class, @var1, @var2)
      end
    
      def perform
        # do something with @var1, @var2
      end
    end
    
  2. 运行查询并返回结果的类

    class MyFinder
      attr_reader :result
    
      def self.execute(params, options={})
        new(params, options).execute
      end
    
      def initiailize(params, options)
        @params = params || {}
        @options = options
      end
    
      def execute
        # run query and set the result in instance variable
        @result = SomeModel.where(params)
      end
    end
    

1 个答案:

答案 0 :(得分:0)

这是一个Factory Method,以下是一个反映你在那里的内容的例子。可以找到here的例子,用ruby术语解释它,并深入介绍它以及其他模式。

class AdjacencyMatrix  
  class << self  
    def undirected(data)  
      new(data)  
    end  

    def directed(data)  
      new(data,true)  
    end  

    private :new  
  end  

  def initialize(data, directed=false)  
    #...  
  end  
end  

undirected_matrix = AdjacencyMatrix.undirected(data)   
directed_matrix   = AdjacencyMatrix.directed(data)