和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。
工厂方法模式的主要角色:
- 抽象工厂(AbstractFactory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
工厂方法模式的实现
![](https://i-blog.csdnimg.cn/direct/e5b41375ad584799857964ef6190e65e.png)
抽象工厂接口:
![](https://i-blog.csdnimg.cn/direct/b50a858c255f4fd684e1428663094672.png)
具体工厂
![](https://i-blog.csdnimg.cn/direct/a57d28e1838f4b41a2a91f09e60dfa46.png)
咖啡店类
![](https://i-blog.csdnimg.cn/direct/eeb28dab3dc447d78acf5555cdbb7ce2.png)
从以上的编写的代码可以看到,要增加产品类时也要相应地增加工厂类,不需要修改工厂接口的代码了,这样就解决了简单工厂模式的缺点。
工厂方法模式是简单工厂模式的进一步抽象。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
**优点:**用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则:
**缺点:**每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。