什么是工厂模式和简单工厂模式
工厂模式 - 整个设计模式的灵魂 - 分工
由于在学习 Mybatis 框架的时候,碰到了 SqlSessionFactoryBuilder 和 SQLSessionFactory 来构建和读取写在配置文件中的 sql 语句。而那个时候只是听说过工厂模式。所以,特地将工厂模式学了一下,以下是笔记和个人一些看法:
- 工厂模式:实现了创建者和调用者之间的分离。之前我们写的一些东西,创建者和调用者之间耦合性很高,调用者也会创建一些对象。
- 详细分类:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 面向对象设计的基本原则:
- OCP(开闭原则:Open-Closed Principe):一个软件的实体应当对扩展开放,对修改关闭。这就意味着,以后要扩展新的功能,不能对当前的类进行修改来实现,而是通过增加新的类来实现。
- DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。以前我们编程,同时通过类和类之间的调用。这个原则意味着,以后我们在编程的时候,应该多依赖于抽象而不是具体。这个意思就是,当前有A , B 两个类。当 A 需要去调用 B 时,B应该实现一个接口。A 应该直接和 B 的接口发生关系,而不是和B 的实现发生关系。
- LoD(迪亚密特,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。这个意味着,一个类,尽量少依赖于其他类。这样可以实现类和类之间的解耦。如果依赖太多,以后在进行扩展时就会产生不利的影响。
- 核心本质:
- 实例化对象,用工厂方法代替 new 操作。
- 将选择实现类、创建对象统一管理和控制。从而将调用者根我们的实现类解耦。
- 工厂模式:
- 简单工厂模式:
- 用来生产同一等级结构中的任意产品。(对于新增加的产品,需要修改已有代码)
- 虽然某种程度不符合设计原则,但实际用的最多。
- 工厂方法模式:
- 用来生产同一等级结构中的固定产品。(支持增加任意产品)
- 不修改已有类的前提下,通过增加新的工厂类实现扩展
- 抽象工厂模式
- 将用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
- 不可以增加产品,可以增加产品族。
- 简单工厂模式:
- 应用场景
- JDK 中 Calendar 的 getInstance 方法
- JDBC 中 Connection 对象的获取
- hibernate 中 SessionFactory 创建 Session
- spring 中 IOC 容器创建管理 bean 对象
- XML 解析时的 DocumentBuilderFactory 创建解析器对象
- 反射中 Class 对象的 newInstance 方法
简单工厂模式
要点:
- 简单工厂模式也叫静态工厂模式,就是工厂太一般是使用静态方法通过接受的参数的不同来返回不同的对象的实例。
- 对于增加新产品无能为力!不修改代码的话,是无法扩展的。这个是违反开闭原则的。