设计模式
原则:
单一职责:1个包,1个类,1个方法都只做一件事。比如Controller,Service,Dao。然而也会由另外一个问题Service过重,转而DDD。
接口隔离:依赖建立在最小的范围,每个接口只做它该做的事情,只存它应该存的方法,多做一些接口,功能隔离开。
依赖倒转:细节依赖抽象。1:属性+构造方法(组合),2:方法中的参数(依赖),3:setter方法传递(聚合)
里氏替换:子类不要重写父类的方法,如果重写了,考虑抽象出单独的接口,能不使用继承就不继承,可以使用聚合,组合的方式。
开闭原则:类,模块,函数应该对拓展开放,对修改关闭。不要写很长的if else ,如果方法参数种有一个类,就想想能不能是一个抽象类或者接口,直接调用它的方法,而不是再去判断他的属性。
迪米特法则:类与类之间降低依赖,一个类在另外一个类中的位置从近到远是:1.继承或实现 2.成员变量,方法参数或者返回值 3.局部变量 4.引用jar包,尽可能减少依赖。
合成复用原则:原则是尽量使用合成、聚合的方式,而不是使用继承。
模块化和开闭原则:一个jar包可以对外修改,对内不变。
类与类之间的关系:
依赖:只要一个类型中出现了另外一个类
泛化:extends
实现:implements
关联:
聚合:
组合:
第一类:如何生产一个对象
单例模式(SqlSessionFactory):线程安全且效率高的创建一个单例对象
比较重的对象,程序中只有一个。比如Spring的示例默认都是单例。推荐使用静态内部类,枚举,双重检查懒汉式。
// 懒汉式(线程安全,同步方法) class Singleton { private static volatile Singleton instance; private Singleton() {} //提供一个静态的公有方法,加入双重检查代码,解决线程安全问题, 同时解决懒加载问题 //同时保证了效率, 推荐使用 public static Singleton getInstance() { if(instance == null) { synchronized (Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } }
// 静态内部类完成, 推荐使用
class Singleton {
private static volatile Singleton instance;
//构造器私有化
private Singleton() {}
//写一个静态内部类,该类中有一个静态属性 Singleton
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
//提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
public static synchronized Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
//使用枚举,可以实现单例, 推荐
enum Singleton {
INSTANCE; //属性
public void sayOK() {
System.out.println("ok~");
}
}
factory工厂模式:不要直接持有抽象类,可以持有与抽象类有关系的工厂。
静态工厂:
工厂方法:
抽象工厂:
builder构造者模式:持有的工厂中需要需要组织很多方法的执行过程,则用构造者。StringBuider
抽象工厂和构造者模式的区别:抽象工厂实现对产品家族的创建,不需要关心构建过程,建造者模式通过组装零配件产生一个新产品。
adapter适配器模式:很多类都需要转换成另外一个类才可以使用 DispatchHandler
类适配器模式:
对象适配器:
接口适配器:
bridge桥接模式:抽象出品牌 brand 属性不如将属性抽象成 brand接口
改良前:
改良后:
decorator装饰者模式:解决因为层层包装引发的类爆炸问题
composite组合模式:可以生成树形结构的架构,不使用层层继承 HashMap
facade外观模式:;屏蔽子系统的实现细节,抽象一个高层接口统一管理
flyweight享元模式:解决大量创建重复对象造成资源浪费的问题如:数据库连接池 / String的常量池
proxy代理模式:
静态代理,动态代理:JDK,cglib
template模板模式:抽象方法中可以添加钩子方法 Spring IOC:ConfigurableApplicationContext
command命令模式:JdbcTmplate
visitor访问者模式:在被访问的类里面加一个对外接待访问者的角色
案例:
iterator迭代器模式:提供一个统一的方法聚合对象,不考虑其内部聚合的类型
observer观察者模式:
mediator中介者模式:
memento备忘录模式:
interpreter解释器模式:当有语言需要解释执行时使用 Sping中SpelExpressionParser
state状态模式:解决对象在多种状态转换时,需要对外输出不同的行为,状态和行为一一对应,状态之间可以相互转换。
适用于不复杂的流程图,且流程中的状态可以相互转换。
strategy策略模式:由于继承超类的改变带来的益处效应
respon职责链模式:SpringMVC HandlerExecutionChain