1、概念
工厂模式”封装”了复杂的类体系结构,额外提供工厂类,返回类体系结构的核心对象,方便用户使用。这样用户就只需要了解核心对象,而不用去详细了解整个类体系结构,大大简化和方便了框架的调用。
工厂模式有三种,简单工厂,工厂方法模式,抽象工厂模式。本文中只介绍工厂方法模式,其他两种模式都是相似的。
在使用工厂模式时需要注意工厂类的唯一职责是创建核心对象,不应该被赋予更多的职责。
对于某些很容易理解的类结构,创建额外的工厂类反而会导致类结构变的复杂,例如Fruit下面有三个子类Apple,Banana,Watermelon。
2、UML图
3、代码
额外提供工厂接口,以及对应的实现类。
3.1 工厂接口类
/** * * @File Name: CoreObjectFactory.java * @Description: 为了创建核心对象而提供的工厂类接口 * @version 1.0 * @since JDK 1.8 */ public interface CoreObjectFactory { /** * * @Title: createCoreObject * @Description:创建核心对象 * @return */ CoreObject createCoreObject(); /** * @Title: createCoreObject * @Description:创建核心对象,上述方法的重载 * @param props 核心对象需要的核心属性 * @return */ CoreObject createCoreObject(CoreProperty props); }
3.2 默认的工厂接口实现类
/** * @File Name: DefaultCoreObjectFactory.java * @Description: 工厂接口类的默认实现 * @version 1.0 * @since JDK 1.8 */ public class DefaultCoreObjectFactory implements CoreObjectFactory { @Override public CoreObject createCoreObject() { // 写创建CoreObject的逻辑 return null; } @Override public CoreObject createCoreObject(CoreProperty props) { // 编写创建CoreObject的逻辑 return null; } }
4、讨论
问题1:简单工厂,工厂方法,抽象工厂三者有什么区别?
答:工厂模式的主要职责都是创建对象,三者的区别体现在所创建对象的复杂度上。
对于简单工厂模式,它所创建的对象较为简单,根据工厂方法的参数判断返回对象的类型。
工厂方法模式,在类结构上做了升级,额外的创建了工厂接口和实现类,工厂接口中封装了创建对象的方法,实现类提供具体的实现细节,不同的实现类有着不同的实现方式和不同的子类。
抽象工厂方法模式,它所创建的对象一般较为复杂,需要很多”零部件”,为每种”零部件”提供不同的工厂接口和实现类。例如日常生活中的电脑,显示器,芯片,键盘,鼠标等这些零部件都由不同的厂商提供。
它的核心思想在于整体与局部的解耦,例如鼠标类型和电脑类型完全是独立的,你可以在华硕电脑上配置达尔优鼠标,雷蛇鼠标,也可以在联想电脑上配置。换一种鼠标类型对电脑没有影响,换一种电脑类型对鼠标也没有任何影响。
5、示例
- Mybatis框架中的SqlSessionFactory,返回核心的sqlSession对象
- Log4j或者是logback框架中的LoggerFactory,返回核心的Logger对象。尤其是Logger,基本上每天都在使用。