工厂方法模式

意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。

工厂方法模式是面向对象设计中最为常用的模式,这种模式是创建对象的最好方式之一。在工厂方法模式中,我们创建对象不需要向客户暴露创建的逻辑,转而使用通用的接口去引用一个新创建的对象。

实现

下面是一个具体的实现。

class Car
  def run
    raise NotImplementedError, "must implement run method in subclass"
  end
end

class BMW < Car
  def run
    p "BMW on the way!"
  end
end

class Audi < Car
  def run
    p "Audi on the way!"
  end
end

class CarFactory
  def make_car car
    car.safe_constantize.new
  end
end

class DriveCar
  def drive
    car = CarFactory.new.make_car "BMW"
    car.run
  end
end

在上面的实现中,我们首先中创建一个Car, 其中定义了必须被子类复写的方法。然后创建两个子类,BMW, Audi类。这两个类都覆写了父类run方法, 然后定义一个CarFactory用来返回特定的车辆实例。工厂方法不在将与特定应用有关的类绑定到代码中。

适用性

  • 当一个类不知道它所要创建的对象的类的时候。
  • 当一个类希望由它的子类来指定要创建的对象的时候。
  • 当类将创建的对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者的这一信息局部化的时候。

参考文献: