解决核心问题:为了解决简单工厂模式新增具体产品时,需要修改工厂类的逻辑的问题。这违背了开闭原则。
要点
- 简单工厂模式中,工厂类处于整个工厂的核心位置,逻辑繁重,具体的产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性。
- 工厂方法模式中,将单个工厂分割为多个单一的工厂,针对不同的产品提供不同的工厂。
定义
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式将让一个类的实例化延迟到其子类。
UML类图
角色以及职责
- Product(抽象产品):定义产品的接口,是工厂方法模式所创建对象的超类,也就是产品对象的公共父类。
- ConcreteProduct(具体产品):实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。
- Factory(抽象工厂):声明了工厂方法,用于返回一个产品,抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
- ConcreteFactory(具体工厂):抽象工厂类的子类,实现了抽闲工厂中定义的工厂方法。并可由客户端调用,返回一个具体产品的实例。
总结
- 主要优点:
- 工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪些具体产品类将被实例化这一细节,用户只需要关系所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。