Ruby - 方法工厂

时间:2015-08-28 05:23:26

标签: ruby design-patterns factory-pattern

我正在阅读有关Factory Method Pattern的内容,即使在阅读examplesquestions后,我仍然无法理解如何在实际案例中使用它。

例如,假设有两种方法可以将数据输入我的类,即用户输入可以是:

  

姓名姓氏

     

姓氏,姓名

我会或多或少地解决这个问题:

class Name
  attr_accessor :name
  attr_accessor :surname
  def initialize(rawname)
    if(rawname.include? ',')
      @name = rawname.split(', ').last
      @surname = rawname.split(', ').first
    else
      @name = rawname.split(' ').first
      @surname = rawname.split(' ').last
    end
  end
  def print
    puts "#{@name} #{@surname}"
  end
end

我应该如何在这个例子中实现Factory方法?或者一般来说,我的流程应该如何才能使用这种设计模式?

2 个答案:

答案 0 :(得分:4)

我应该如何在这个例子中实现工厂方法?

你不应该。

  

在基于类的编程中,工厂方法模式是一种创建模式,它使用工厂方法来处理创建对象的问题,而无需指定将要创建的对象的确切类。

如果你有Name的专门子类,那么可能。

为了使用这种设计模式,我的思维过程应该如何?

你的第一个想法应该是"这种模式在这里有意义吗?我是否足够理解这种模式,试图在这里应用它?"。如果答案是"是"和"是",然后你只需应用它。

更新

您最有可能意味着在这里使用的是Factory pattern

  

在基于类的编程中,工厂是类

的构造函数的抽象
class NameFactory
  def self.create(str)
    # break str here
    Name.new(first_name, last_name)
  end
end

# then

@user.name = NameFactory.create(params[:user_name])

在这个具体的例子中,在现实生活中,我不会使用任何工厂的东西。这只是无根据的并发症。但如果我有一个更复杂的课程(比如Transaction),那么我会采用某种创作模式,是的。大多数情况下,它只是Builder

答案 1 :(得分:1)

这不是最优的,但您可以先将原始名称规范化。

class Name
  attr_accessor :name, :surname
  def initialize(rawname)
    @name, @surname = rawname.split(", ").rotate.join(" ").split
  end
end