工厂方法模式定义:
工厂方法(别名Virtual Constructor)定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法使类的实例化推迟到子类。
UML图
工厂方法模式特点
- 工厂方法让子类决定要实例化的类是哪一个。所谓的“决定”并不是指模式允许子类本身在运行时做决定,而是指编写抽象工厂类时,不需要知道实际创建的产品是哪一个。选择使用了那个子类,自然就决定了实际使用的产品是什么。
- 工厂方法模式是由简单工厂经过重构(利用多态性替换复杂的if else逻辑)而成。
- 工厂方法是简单工厂的推广,简单工厂是工厂方法的退化。
- 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。
- 工厂方法不一定每一次都返还一个新的对象。但是它所返还的对象一定是他自己创建的,而不是在一个外部对象里面创建,然后传入工厂对象中的。
工厂方法模式优点
- 客服了简单工厂破坏开放-封闭原则的缺陷,如果要增加一个产品,这需要增加一个相应的工厂类就行了。
- 这相当于整个工厂和产品体系是符合了开放-封闭原则的
- 封装了对象创建过程,使得需要更换对象时,不需要做大的修改就可以实现,降低了客户端与产品对象的耦合性。
工厂方法模式缺点
- 工厂模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择的问题还是存在的,也就是说,工厂方法把简单工厂的内部判断逻辑搬到了客户端代码中。如果想要加新的功能,本来是改工厂类的,现在要改客户端。
- 这也只是相当于整个工厂和产品体系是符合了开放-封闭原则的,而客户端其实并没有符合
- 工厂方法是简单工厂方法的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂方法模式的优点,而且客服了一定的缺点。但缺点是每增加一个产品类就需要增加一个工厂类,增加了开发的工作量。
工厂方法模式适用场景:
- 类不知道自己要创建哪一个对象
- 类用它的子类来指定创建哪个对象
- 客户需要清楚创建了哪一个对象
代码下载:
稍后上传