设计原则

  1. 开-闭原则

  2. SOLID原则

  • 里氏替换原则,面向接口/抽象类编程

在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象

  1. happens-before原则

具体的定义为: 1)如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。

2)两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序并不非法(也就是说,JMM允许这种重排序)。

具体的规则: (1)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。 (2)监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。 (3)volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。 (4)传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。 (5)start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。 (6)Join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。 (7)程序中断规则:对线程interrupted()方法的调用先行于被中断线程的代码检测到中断时间的发生。 (8)对象finalize规则:一个对象的初始化完成(构造函数执行结束)先行于发生它的finalize()方法的开始。 ———————————————— 版权声明:本文为CSDN博主「发奋小青年」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ma_chen_qq/article/details/82990603

常见设计模式

单例

  1. 饿汉

在类加载阶段就实例化类

public class Singleton {

    // 使用private将构造方法私有化,以防外界通过该构造方法创建多个实例
    private Singleton() {
    }

    // 如果使用private封装该实例,则需要添加get方法实现对外界的开放
    private static Singleton instance = new Singleton();
    // 添加static,将该方法变成类所有   通过类名访问
    public static Singleton getInstance(){
        return instance;
    }
}
  1. 懒汉

在类被第一次访问的时候再实例化

class LazySingleton {
    //**volatile是解决指令重排序的问题,防止对象未成功初始化就被使用**
    //因为对象的创建实际上是三条指令: 1、分配内存地址 2、内存地址初始化 3、返回内存地址句柄 其中2、3之间可能发生指令冲排序,导致线程A正在创建对象先执行1、3两步,结果线程B进来判断句柄已经不为空,直接返回给上层方法,此时对象还没有正确初始化内存,导致上层方法发生严重错误。
    private volatile static LazySingleton instance = null; 
 
    private LazySingleton() { } 
 
    public static LazySingleton getInstance() { 
        //第一重判断
        if (instance == null) {
            //锁定代码块
            synchronized (LazySingleton.class) {
                //第二重判断
                if (instance == null) {
                    instance = new LazySingleton(); //创建单例实例
                }
            }
        }
        return instance; 
    }
}
  1. 内部静态类
class Singleton {
	private Singleton() {
	}
	
    //Singleton类加载时HolderClass内部类不会加载,所以Singleton不会实例化,等调用getInstance的时候才实例化
	private static class HolderClass {
            private final static Singleton instance = new Singleton();
	}
	
	public static Singleton getInstance() {
	    return HolderClass.instance;
	}
	
	public static void main(String args[]) {
	    Singleton s1, s2; 
            s1 = Singleton.getInstance();
	    s2 = Singleton.getInstance();
	    System.out.println(s1==s2);
	}
}
  1. 枚举单例
public enum Singleton {

    INSTANCE;

    public void doSomething() {
        System.out.println("doSomething");
    }

}

工厂三兄弟

  1. 简单工厂/静态工厂
  2. 工厂方法
  3. 抽象工厂

观察者模式

Java内置的Observerable、Observer

spring中的事件通知机制

模板方法模式

参考

史上最全设计模式导学目录