单例模式简介

知识回顾

修饰符:
    权限修饰符:public、 protected、默认不写、private 
        public:共有的、当前工程的任意位置都能访问到
        protected: 保护的 本类、同包、子类
        默认不写:默认的、本类、同包
        private:私有的、本类
        
    特征修饰符:final、static、abstract、native、transient、synchronized、volatile

final:
    修饰变量:只有一次赋值的机会、赋值之后值不能发生改变
    属性:要求必须赋初始值、不能再次发生改变
    方法:表示该方法不能被子类 重写
    修饰类:表示该类不能 被继承、没有后代子类

static:
    修饰属性、修饰方法、修饰块、修饰内部类
    1:静态元素在类加载时即被初始化、创建的很早、创建时只有类、没有对象
    2:静态元素 存储在静态元素区内、每一个类都有自己单独的区域、与其他的类不会产生冲突
    3:静态元素区不能被GC管理,可以简单粗暴的认为静态元素常驻内存。
    4:静态元素只加载一次、只存在一份、全部的类对象和类本身共用这一份。
    5:可以理解为 静态元素与对象没有关系、只属于类
    6:由于静态元素再加载的时候没有创建对象,所有通过类名字直接访问
        eg:Math.random();
    7:静态元素可以直接访问静态元素(都存在于静态元素区中)
    8:非静态元素可以直接访问静态元素(非静态元素存储于堆内存的对象空间中、静态元素存储于静态区、所以能访问)
    9:静态元素是不能访问非静态元素(静态元素是单独存在的有且只有一份,而非静态元素存在于多个类对象成员中,所以无法确定是那个,导致静态元素不能访问非静态成员)
    10:静态元素中不能使用 this super 关键字 (this 和 super 代替对象的 所以没法确定是那个对象)

 

1、设计模式

 

1:设计模式不是知识点
2:设计模式是一种设计经验的总结
3:设计模式用来解决某些场景下的某一类问题的----》通过的解决方案
4:有了设计模式 可以更容易理解代码、确保了代码的复用性、可靠性、可延展性

设计模式分为三类:
    1:创建型模式(5种)---》用于解决对象的创建过程
    2:结构型模式(7种)---》把类或者对象通过某种形式结合在一起,构成某种复杂或合理的结构
    3:行为型模式(11种)---》解决类或对象之间的交互 更合理的优化类或对象之间的关系

 

2、单例模式(Singleton)

比如 售票系统只有一个,而卖票的窗口有很多个,相对于窗口而言,系统只能有一个。所有的买票窗口将公用这一个系统,所以当前的系统只能是单例的(Singleton)

单例模式的实现:
	1:私有的构造方法
	2:私有的静态的当前类对象作为属性
	3:公有的静态的方法返回当前类对象

2.1、饿汉式

是否 Lazy 初始化:不是懒加载机制 立即加载的机制
是否多线程安全:是
实现难度:易
描述:这种方式比较常用,但容易产生垃圾对象。
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
/**
 * @author :陈江一
 * @description: 饿汉式单例模式
 */
public class SingleTon {

    private static SingleTon singleTon = new SingleTon();

    private SingleTon() {}

    public static SingleTon getSingleTon() {
        return singleTon;
    }
}

2.2、懒汉式(线程安全)

是否 Lazy 初始化:是懒加载的机制
是否多线程安全:是
实现难度:易
描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率
/**
 * @author : 小熊猫陈江一
 * @description: 单例模式的设计 通过自己的设计
 * 让当前的类只能产生一个对象
 */
public class SingleDog {

    // static 静态元素只加载一次
    // private 私有的是为了避免外部调用而改变 SingleDog
    private static SingleDog singleDog;

    // 1 私有的构造方法、外面就不能随意的创建对象
    private SingleDog() { }

    // 2 在当前 SingleDog 类中的某个成员位置创建唯一的一个对象
    // 方法每次调用一次都会执行一次 所以方法不能保证唯一
    public static synchronized SingleDog getSingleDog() {
        if (singleDog == null) {
            singleDog = new SingleDog();
        }
        return singleDog;
    }

}

2.3、懒汉式(双检锁/双重校验锁)

JDK 版本:JDK1.5 起
是否 Lazy 初始化:是
是否多线程安全:是
实现难度:较复杂
描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
getSingleton() 的性能对应用程序很关键。
/**
 * @author : 小熊猫陈江一
 * @description: 单例模式的设计 通过自己的设计
 * 让当前的类只能产生一个对象
 */
public class Singleton {  
    
    private volatile static Singleton singleton;  
    private Singleton (){}  
    
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}

 

你可能感兴趣的:(单例模式简介)