设计模式概述

设计模式是一套被反复使用,多数人知晓的,经过分类编目的代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性,可读性和可靠性

设计模式的六大设计原则

  1. 开闭原则
    核心思想: 对扩展开放,对修改关闭
    也就是说,对已经使用的类的改动是通过增加代码进行的,而不是通过修改原有代码
  2. 单一职责原则
    可以理解为高内聚,低耦合;也就是说每个类应该只有一个职责,对外只提供一种功能,而引起类变化的原因应该只有一个
  3. 里氏替换原则
    核心思想: 在任何父类出现的地方都可以使用其子类来代替
    任何出现父类或者接口的地方,都可以使用子类的实现去替代。也就是说,同一个继承体系中的对象应该有共同的行为特征
  4. 依赖倒转原则
    核心思想: 要依赖于接口和抽象类,不要依赖于具体的实现
    在应用程序中,所有的类如果使用或者依赖于其他的类,则应该依赖于这些类的抽象类或者接口,而不是直接依赖这些类的实现类
  5. 接口分离原则
    核心思想: 程序不应该依赖它们不需要使用的方法
    一个接口中不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该将所有的操作都封装到一个接口中
  6. 迪米特原则(最少认知原则)
    核心思想: 一个对象应当对其他的对象尽可能少的理解
    用于降低各个对象之间的耦合,提高系统的可维护性

设计模式的三种类型

  1. 创建型模式
    创建型模式包括单例模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式
  2. 结构型模式
    结构型模式包括代理模式,适配器模式,装饰模式,亨元模式,外观模式,桥接模式,组合模式
  3. 行为型模式
    行为型模式包括模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

关于设计模式的一些基本概念就介绍到这里,下面进入本节的正题--单例模式

单例设计模式

单例设计模式是一种常用的设计模式。在Java应用中,单例对象能够保证在一个JVM中,该对象的只有一个实例存在。所以单例类会具有以下的特点
1. 单例类只有一个实例对象
2. 实例对象由单例类自行提供
3. 单例类对外提供一个访问该单例的全局访问点
由此可以推断出单例类的构成: 构造器私有化,提供静态的方法供外部获取单例类的对象

单例模式的分类

单例模式有两种写法,懒汉式和饿汉式,饿汉式单例的写法很简单,直接创建对象即可
public class Singleton {
    // 构造私有
    private Singleton(){}
    
    private static Singleton singleton = new Singleton();
    
    // 提供静态方法供外部获取实例
    public Singleton getSingleton(){
        return singleton;
    }
}

懒汉式单例是在需要使用时才会创建实例,懒汉式单例有以下几种写法
写法一:
public class Singleton {
    // 构造私有
    private Singleton(){}
    
    private static Singleton singleton = null;
    
    // 提供静态方法供外部获取实例
    public static Singleton getSingleton(){
        if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

在写法一的代码中,程序处于低并发时,可能不会出现问题,但是在高并发的情况下,内存中可能会出现多个实例,这样就违反了单例模式的原则,解决线程安全问题的方法有多种,最为简单的一种就是直接在获取实例的方法上加上synchronized关键字,但是直接锁方法会影响程序的效率,这里提供一种双重检测的写法
写法二:
public class Singleton {
    // 构造私有
    private Singleton(){}
    
    private volatile static Singleton singleton = null;
    
    public static Singleton getSingleton(){
        if (singleton == null){
            synchronized (Singleton.class){
                if (singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

除了写法二,这里再提供一种线程安全的懒汉式单例写法
public class Singleton {
    // 构造私有
    private Singleton(){}
    
    // 此处使用一个内部类来维护单例
    private static class SingletonFactory{
        private static Singleton singleton = new Singleton();
    }
    
    public static Singleton getSingleton(){
        return SingletonFactory.singleton;
    }
}

Lemon
22 声望2 粉丝