23种设计模式之---单例模式

闲来无事学一下设计模式,希望这23种可以一直更下去,什么时候能更完呢,也许一个月,也许一年,也许断更

设计模式六大原则

本文是23篇的第一篇,在学习设计模式之前,你需要了解下六大原则

1、开闭原则(Open Close Principle)

开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3、依赖倒转原则(Dependence Inversion Principle)

这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

5、迪米特法则,又称最少知道原则(Demeter Principle)

最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

其实啥意思我也看不懂,总而言之就是做到低耦合高内聚。

开始正片。

介绍

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。

饿汉式

类装载时就进行实例化,容易产生垃圾。

java 复制代码
package singleton;

/**
 * @author yuanmengda
 * 饿汉式
 */

public class HungrySingleton {
    private static HungrySingleton instance = new HungrySingleton();
    private HungrySingleton(){

    }
    public static HungrySingleton getInstance(){
        return instance;
    }
}

懒汉式

调用时才加载,但方法加了synchronized,效率低

java 复制代码
package singleton;

/**
 * @author yuanmengda
 * 懒汉式
 */
public class LazySingleton {
    private static LazySingleton instacne;
    private LazySingleton(){

    }
    public static synchronized LazySingleton getInstacne(){
        if(instacne == null){
            instacne = new LazySingleton();
        }
        return instacne;
    }
}

双重锁校验

线程安全且效率高

java 复制代码
package singleton;

/**
 * @author yuanmengda
 * 双重锁校验(Double-checked Locking)
 */
public class DCLSingleton {
    private volatile static DCLSingleton instance;
    private DCLSingleton(){

    }
    public static DCLSingleton getInstance(){
        if(instance == null){
            synchronized (DCLSingleton.class){
                if (instance == null){
                    instance = new DCLSingleton();
                }
            }
        }
        return instance;
    }
}

静态内部类

类似于饿汉延时加载

java 复制代码
package singleton;

/**
 * @author yuanmengda
 * 静态内部类式
 */
public class StaticInnerClassSingleton {
    private static class SingletonHolder{
        private static StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
    }
    private StaticInnerClassSingleton(){

    }
    public static StaticInnerClassSingleton getInstance(){
        return SingletonHolder.instance;
    }
}

最佳方法---枚举类

实现单例模式的最佳方法,简洁,且枚举类天然单例。

java 复制代码
package singleton;

/**
 * @author yuanmengda
 * 枚举类
 */
public enum EnumSingleton {
    INSTANCE;
}

测试

java 复制代码
package singleton;

/**
 * @author yuanmengda
 */
public class Main {
    public static void main(String[] args) {

        //1.饿汉式
        HungrySingleton instance1 = HungrySingleton.getInstance();
        HungrySingleton instance2 = HungrySingleton.getInstance();
        System.out.println(instance1 == instance2);

        //2.懒汉式
        LazySingleton instance3 = LazySingleton.getInstacne();
        LazySingleton instance4 = LazySingleton.getInstacne();
        System.out.println(instance3 == instance4);

        //3.双重锁校验
        DCLSingleton instance5 = DCLSingleton.getInstance();
        DCLSingleton instance6 = DCLSingleton.getInstance();
        System.out.println(instance5 == instance6);

        //4.静态内部类
        StaticInnerClassSingleton instance7 = StaticInnerClassSingleton.getInstance();
        StaticInnerClassSingleton instance8 = StaticInnerClassSingleton.getInstance();
        System.out.println(instance7 == instance8);

        //5.枚举类
        EnumSingleton instance9 = EnumSingleton.INSTANCE;
        EnumSingleton instance10 = EnumSingleton.INSTANCE;
        System.out.println(instance9 == instance10);

    }
}
相关推荐
晨米酱12 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机17 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机18 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤18 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式