面向对象设计的基本原则
OCP(开闭原则) :一个软件的实体应当对扩展开放,对修改关闭。
DIP(依赖倒转原则):要针对接口编程,不要针对实现编程。
LoD(迪米特法则): 只与你直接的朋友通信,而避免和陌生人通信。
工厂模式核心本质:
-实例化对象,用工厂方法代替new操作。
-将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。
工厂模式(实现创建者和调用者的分离)分为3大类
简单工厂模式
描述: 简单工厂模式是由一个工厂对象根据收到的消息决定要创建哪一个类的对象实例
使用场景
工厂类负责创建的对象比较少,客户只需要传入工厂类的参数,对于如何创建对象
(逻辑)不关心,简单工厂模式很容易违反高内聚,低耦合的原则,英雌一般只在很简单的情况下使用
优点: 工厂类中包含了必要的逻辑们根据客户需要的逻辑动态实例化相关的类
工厂方法模式
描述:
定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中
使用场景:
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
简单方法模式和工厂方法模式相比较:
结构复杂度较低
代码复杂度较低
客户端编程难度较低
管理上的难度较难,工厂方法模式满足OCP他有良好的扩展性
根据设计理论来说,工厂方法模式占优,但实际上,我们一般使用简单工厂模式
抽象工厂模式:
抽象工厂模式是工厂方法模式的生级版本,它是用来创建一组相关或者相互依赖的对象
抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口,
而无需指定他们具体的类,就是一个工厂里面放一些相关的类,使工厂数减少。
最好的好处在于易于交换产品系列,其次是让具体的创建实例的过程与客户端分离开,
客户端通过他们的抽象接口操作实例,产品的具体类名也被具体工厂的事项分离,不会出现在客户代码中
他与工厂方法模式的去区别在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的
工厂模式的应用
JDK中Calendar的getInstance方法
JDBC中Connection对象的获取
Hibernate中Sessionfactory创建Session
Spring 中IOC容器创建管理 bean对象
XML 解析时的DocumentBuilderFactory 创建解析器对象
反射中Class对象的newInstance()
多个产品等级结构,在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有
都是衍生自同一个接口或抽象类,而抽象工厂模式提供的产品则是衍生自不同的接口或抽象类