【设计模式系列】创建型之单例模式

261 阅读2分钟

概述

简单说下什么是设计模式:就是代码编写得套路,官方一点儿讲就是前辈们在代码编写时总结出来的一些编程技巧,形成了一套设计原则和标准。满满的都是经验

参考:

微信公众号-重温23种设计模式:号主是个大美女哦,分享的文章基本的都是干货,不是互相宣传,只是个人感觉很好。

极客时间-王争的设计模式之美:这个专栏很详细,真的很详细,需要花时间仔细看。

一、6大设计原则

  1. 单一职责原则
  2. 里斯替换原则
  3. 依赖倒置原则
  4. 接口隔离原则
  5. 迪米特原则
  6. 开闭原则

6大设计原则详情可以参考上面的微信公众号

二、23种设计模式

23种设计模式

4种创建型模式

主要用于创建对象

1. 单例模式 Singleton Pattern

单例模式确保一个类只有一个实例,并把这个实例在整个系统中共用,单例可以减少内存开销。

单例模式分成两种:

  • 饿汉模式:在类定义时就初始化
  • 懒汉模式:在使用时才进行初始化

实现单例模式的四种方式:

1.饿汉模式:

/**
 * @description 单例模式-饿汉模式 hungry man pattern
 *在类定义的时候就初始化
 * 缺点:不支持延迟加载
 */
public class Singleton {
    public static final Singleton INSTANCE = new Singleton();

    private Singleton(){}

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

2.懒汉模式-双重效验

/**
 * @description 单例模式-懒汉模式(双重效验) lazy man pattern
 * 普通的懒汉模式我就不写了,存在并发性能问题,基本就是串行化的了
 * <p>
 * 在调用的时候初始化
 */
public class Singleton2 {
    private static Singleton2 singleton2;

    private Singleton2() {
    }

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

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

3.静态内部类实现方式

/**
 * @description 单例模式-静态内部类
 * 这种方式有点儿类似饿汉模式,但是它又能做到延迟加载(静态内部类的特性)
 */
public class Singleton3 {
    private Singleton3() {}

    private static class SingletonHolder{
        private static final Singleton3 INSTANCE = new Singleton3();
    }

    public static Singleton3 getInstance() {
        return SingletonHolder.INSTANCE;
    }

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

4.枚举类单例

/**
 * @description 单例模式-枚举类
 * 利用枚举类的特性保证创建对象的唯一性和线程安全性
 */
public enum Singleton4 {
    INSTANCE;

    private Singleton4(){}

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

结束语:设计模式的开篇就是很简单的单例模式,虽然代码看上去真的很简单,但是任然需要花一点儿时间自己动手敲下,没有实践没有发言权。

学习一个技术,最好的方法就是慢慢来,同时,自己动手尝试,忌好高骛远。