意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类,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
用来返回特定的车辆实例。工厂方法不在将与特定应用有关的类绑定到代码中。
适用性
- 当一个类不知道它所要创建的对象的类的时候。
- 当一个类希望由它的子类来指定要创建的对象的时候。
- 当类将创建的对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者的这一信息局部化的时候。
参考文献: