设计模式(四)工厂模式

一般情况下,我们都使用new操作符来实例化对象。这违反了我们面向接口,而不是面向实现编程的原则。实例化这个活动不应该总是公开的,我们最好是把具体类抽象为接口,让需要该实例的客户端依赖于抽象接口。这样我们可以隐藏具体类,如果以后需要更改接口的具体实现,这个更改对于客户端代码是透明的。因为我们解耦了创建者和被创建者。工厂模式就是基于这个作用而生。

工厂方法模式

定义

工厂方法模式,定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。(工厂方法不依赖具体的类,可以实现创建者和被创建者的解耦)。工厂方法让类把实例化推迟到子类。

UML结构

类关系说明

  1. Pizza接口作为具体类的抽象接口
  2. PizzaStore作为工厂方法的抽象类,其提供一个工厂方法createPizza()供子类实现创建Pizza具体类实例

抽象工厂模式

定义

抽象工厂模式,提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类

UML结构

类关系说明

  1. AbstractFactory作为抽象工厂,定义了创建依赖对象的家族,此处为ProductA、ProductB
  2. ConcreateFactory1、ConcreateFactory2实现了抽象工厂AbstractFactory,实现了两个创建依赖对象的方法
  3. Client作为客户端,在其内部持有一个AbstractFactory的实例,在创建Client对象时,我们可以根据需要传入具体的AbstractFactory实现类(如:ConcreateFactory1),创建依赖对象的具体逻辑位于具体的AbstractFactory实现类中,Client只依赖于对象接口。这样我们可以实现客户端代码对依赖对象具体实现的解耦

总结

  1. 我们可以利用工厂模式来封装对象的创建
  2. 工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象
  3. 抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中。
  4. 通过工厂模式减少应用程序和具体类之间的依赖,促进松耦合

源码地址

design_pattern_learn