第六届字节跳动青训营设计模式自学记录| 青训营

45 阅读2分钟

设计模式六大原则

  1. 开闭原则 对扩展开放,对修改关闭。 为了程序的可扩展性好!

  2. 里氏代换原则 任何基类可以出现的地方,子类一定可以出现。是继承复用的基石,面向对象设计采用的就是这种思想。这是对开闭原则的补充。

  3. 单一职责原则 一个类,一个接口只负责一项职责

  4. 依赖倒转原则 指的是面向接口的编程方式,要依赖于抽象而不依赖于具体

  5. 接口隔离原则 使用多个隔离的接口,比使用单个接口要好

  6. 迪米特原则 (最少知道原则)减少类之间的耦合

设计模式的分类

1 创建型模式

隐藏创建对象的逻辑,不是使用new关键字来创建对象。

单例模式,工厂模式,抽象工厂模式,建造者模式。。。

2 结构型模式

关注类和对象的组合,即如何将类或对象按某种布局组成更大的结构

适配器模式,代理模式,享元模式。。。

3 行为型模式

该模式用于描述类或对象之间怎样通信、协作共同完成任务,以及怎样分配职责

访问者模式,责任链模式。。。

单例模式

保证某个类只有一个实例对象,主要防止一个全局使用的类频繁地创建与销毁它的实例。

1 懒汉式 (线程不安全版)

public class Singleton {
    private static Singleton instance;
    private Singleton (){}
​
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2 懒汉式 (线程安全版)

public class Singleton {
    private static Singleton instance;
    private Singleton (){}
​
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3 饿汉式

public class Singleton {  //类加载过程保证了线程安全
    private static Singleton instance = new Singleton();
    private Singleton (){}
    public static Singleton getInstance() {
        return instance;
    }
}

4 双重检查

public class Singleton {
    private volatile static Singleton singleton;   //volatile防止指令重排,不加可能导致没生成实例的时候就返回
​
    private Singleton() {}
​
    public static Singleton getSingleton() {
        if (singleton == null) {  //第一次检查
            synchronized (Singleton.class) {
                if (singleton == null) {  //第二次检查
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

5 静态内部类

public class Singleton {  //内部类是延时加载的,在第一次用到它的时候才加载到内存中,实现了lazy loading
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
​
    private Singleton() {
    }
​
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

6 枚举类

枚举类在第一次使用到的时候才被加载。

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
        
    }  
}

两种懒汉模式不建议使用:普通懒汉线程不安全,加锁懒汉影响性能;

饿汉:唯一缺点就是即使不使用实例,也会在类加载时创建,不能lazy loading;一般用这个就行了

双重检查:既能lazy loading,又能减少锁的影响;但是实现起来比较复杂

静态内部类:比较完美

枚举类:完美。还能防止反序列化和反射破坏单例。