1、工厂方法模式
工厂方法模式: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到它的子类.
示例1:
这里定义了一个 ObjectWrapper 的创建接口 ObjectWrapperFactory ,通过该接口的具体实现类去创建具体的 ObjectWrapper 子类对象.做到了对扩展的开放,对修改的封闭,满足开放-封闭原则((软件实体类、模块或者函数等等,应该可以扩展,但是不可以修改)规则)精神.
示例2:
TransactionFactory 是用于创建 Transaction 的工厂接口,其中最核心的方法是 newTransaction() 方法,它会根据数据库连接或数据源创建 Transaction 对象.
JdbcTransactionFactory 和 ManagedTransactionFactory 是 TransactionFactory 的两个实现类,分别用来创建 JdbcTransaction 对象和 ManagedTransaction 对象.
工厂方法模式将简单工厂的内部判断逻辑,移动到了客户端代码来进行,在扩展新功能的时候,简单工厂模式要修改工厂类,工厂方法模式是只需要修改客户端.
模式作用:
1) 可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关.
2) 可以一定程度增加扩展性,若增加一个产品实现,只需要实现产品接口,修改工厂创建产品的方法,消费者可以无感知(若消费者不关心具体产品是什么的情况).
3) 可以一定程度增加代码的封装性、可读性。清楚的代码结构,对于消费者来说很少的代码量,就可以完成很多工作.
4) 另外,抽象工厂才是实际意义的工厂模式,工厂方法只是抽象工厂的一个比较常见的情况.
适用场景:
1) 消费者不关心它所要创建对象的类(产品类)的时候.
2) 消费者知道它所要创建对象的类(产品类),但不关心如何创建的时候.
例如:hibernate 里通过 sessionFactory 创建 session、通过代理方式生成 ws 客户端时,通过工厂构建报文中格式化数据的对象.
2、工厂模式 + 反射
示例1:
抽象工厂模式: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它的具体类.
示例2:
上例是抽象工厂的简化版本(因为这里没有所谓的创建一系列相关或相互依赖的接口),这里通过范型简化了产品的抽象类与具体实现类(这里可以理解为 class 就是一个抽象接口,当 T 被具体化时候的 class 就是具体实现类),通过反射 + 范型减少了具体工厂实现类的创建与维护.
参考:
1、https://baijiahao.baidu.com/s?id=1723461529698148319&wfr=spider&for=pc