首页 > 技术文章 > 设计模式

yuan66 2021-08-23 14:51 原文

 

原则:

单一职责: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

 

 

 

推荐阅读