JAVA设计模式分为创建型、行为型与结构型三类设计模式,工厂方法与单例、原型、对象池、构建者、抽象工厂同属于创建型设计模式。
一、基本定义与组成
工厂方法(Factory Method)定义一个抽象的工厂接口,创建特定类型的产品Product接口实现,产品实际创建在工厂具体实现类中,工厂实现类可以是一个或多个,具体根据产品型号的复杂性而定。工厂方法与抽象工厂设计模式的差别在于工厂方法一般只创建同一系列产品,而抽象工厂创建不同种类和型号的产品,抽象工厂设计模式是工厂方法模式的升级版。
工厂方法有Product(产品)、Factory(工厂)、ConcreteProduct(实体产品)和ConcreteFactory(实体工厂)四个要素构成,具体UML类图如下:
工厂接口(Factory)。定义产品工厂的产品创建方法createProduct。工厂实现类ConcreteFactory可以有一个或多个,只有一个实现类简化为简单工厂。
实体工厂(ConcreateFactory)。创建Product接口系列产品的所有对象。
产品接口(Product)。定义工厂要创建的产品对象接口,具体实现类可以是一个或多个ConcreteProduct。例如,小汽车生产公司产品Car接口(Product),不同产品型号实现类实现Car接口,包括普通版汽车SimpleCar与豪华版LuxuaryCar。
实体产品(ConcreateProduct)。产品接口Product的具体实现类,例如罐头食品,CanFoods(产品Product),水果罐头FruitCan与肉食罐头MeatCan是(实体产品-ConcreteProduct)。
二、SqlSession的工厂方法设计模式
Mybatis框架的SqlSession采用工厂方法设计模式实例化,模式元素包含包含SqlSession(产品-Product),SqlSessionFactory(工厂-Factory),SqlSessionFactoryBuilder(实体工厂-ConcreteFactory)与DefaultSqlSession(实体产品-ConcreteProduct)等四个,UML类图如下:
分析上述类图可以看出:
SqlSession是设计模式中的产品-Product,定义数据库会话接口,是Mybatis框架的核心对象之一,负责查询select、插入insert、更新update等操作。
SqlSessionFactory是设计模式中的工厂-Factory,定义会话对象SqlSession的创建,提供多种创建场景的openSession接口函数。
DefaultSqlSessionFactory是设计模式中的实体工厂-ConcreteFactory,提供多个重载的openSession创建方法的实现,最终调用openSessionFromDataSource或openSessionFromConnection函数中返回DefaultSqlSession对象实例,代码片段如下图:
三、学习总结
工厂方法Factory Method是一种简单实用的设计模式,对外暴露工厂接口与产品接口,而不暴露更多的具体实现工厂和产品实现类,满足“创建与使用分离”与“接口优先”设计原则,只负责同一个产品系列的不同实现对象创建,这点与升级版抽象工厂不同(创建多个产品系列)。