单列设计模式

简介: 单列设计模式

概念:是应用最广泛的设计模式之一,解决的就是在程序运行过程当中一个类最多只能创建一个对象的问题,保证一个类只有一个实例

避免对象不一致的状态

引入问题:例如一家公司只有一个打印机,但是有多个部门,A部门想使用打印机就创建A部门对象,B部门使用打印机就会创建B部门对象

通过单例模式构造唯一实例:懒汉式、饿汉式、静态内部类

步骤1:创建一个静态类成员

步骤2:构造方法私有化

步骤3:提供一个公共的创建实例方法

实现:构造函数私有化(单例类不能再其他类中实例化,只能被自身实例化)

拥有一个保存类的实例的静态成员变量

通过一个公共的静态方法返回单例类对象唯一实例


饿汉式:立即加载+线程安全

特点:提前进行实例化,立即加载,没有延迟加载,不管有没有被使用都会有一个初始化的实例加载在内存中,jvm保证类在加载过程中static代码块在多线程或者单线程都正确并只执行一次,线程安全,不会出现像懒汉模式中的多线程问题,资源浪费

public class Cz {
    //静态全局变量,内存唯一,创建一个对象出来
    private static Cz cz = new Cz();//饿汉式,创建一个对象
    private Cz(){};//构造方法私有化
    public static Cz getInstance(){ //提供一个公共方法来创建实例,由该类自己创建的实例
        return cz;
    }
    public static void main(String[] args) {
    Cz c1 = Cz.getInstance();  //创建实例
    Cz c2 = Cz.getInstance();
    System.out.println(c1==c2); //true 判断两个实例是否指向同一个对象
}
}


懒汉式:延迟加载,线程不安全

特点:实现了延迟加载,在多线程可能会出现问题不能保证线程安全

public class Cz {
    //静态全局变量,内存唯一,创建一个对象出来
    private static Cz cz = null;//创建一个私有对象
    private Cz(){}//创建私有构造方法
    public static Cz getInstance(){
        if (cz == null){
            cz = new Cz();
        }
        return cz;
    }
    public static void main(String[] args) {
        Cz c1 = Cz.getInstance();
        Cz c2 = Cz.getInstance();
        System.out.println(c1 == c2);
    }
}


静态内部类单例设计模式:延迟加载+线程安全 一般被称之为Holder

特点:用更少的代码达到延迟加载,由于内部类在编译完成之后也是一个单独的class文件,因此在不使用的情况下SingletonHolder类是不会被加载的,同时jvm在加载在过程中static代码块在多线程或单线程下都正确执行,仅执行一次就解决了延迟加载和线程安全

public class Cz {
    //静态方法私有化
    private Cz(){}
    //静态内部类
    private static class SingletonHolder{
        private static Cz cz = new Cz();
    }
    //提供公共方法创建单例对象
    public static Cz getInstance(){
        return SingletonHolder.cz;
    }
    public static void main(String[] args) {
        Cz c1 = Cz.getInstance();
        Cz c2 = Cz.getInstance();
        System.out.println(c1 == c2);
    }
}


相关文章
|
27天前
|
设计模式 算法 Java
16.迭代器模式设计思想
本文详细介绍了迭代器模式的设计思想、原理、结构及应用场景,通过Java代码示例解析了迭代器模式的具体实现过程,并讨论了其优缺点及适用环境。迭代器模式通过提供统一的遍历接口,简化了集合对象的访问,支持多种遍历方式,同时保持了良好的封装性和灵活性。文章还提供了丰富的资源链接,帮助读者深入理解和应用设计模式。
47 7
|
4月前
|
设计模式 XML 存储
何时使用复合设计模式?
【8月更文挑战第22天】
37 0
|
设计模式 存储
组合设计模式解读
组合设计模式解读
|
设计模式 算法 uml
CRUD很无聊?一起学设计模式吧!--策略模式
CRUD很无聊?一起学设计模式吧!--策略模式
104 0
|
设计模式 Java
浅谈设计模式 - 迭代器模式(十一)
迭代器模式通常只需要知道该模式的实现原理和了解结构图即可,在设计模式当中自己实现的情况几乎是没有的,所以这个模式简单的过一遍。
96 0
|
设计模式
【设计模式】【第八章】【商品多级分类目录场景】【组合模式+访问者模式】
创建design-demo项目 创建ItemController 创建ItemService 创建ItemServiceimpl 创建ItemVisitor 创建DelItemVisitor 创建AddItemVisitor 创建ProductItem 创建AbstractProductItem 创建MockDb
114 0
|
设计模式 C++ 容器
【设计模式学习笔记】解释器模式、迭代器模式案例详解(C++实现)
【设计模式学习笔记】解释器模式、迭代器模式案例详解(C++实现)
359 0
【设计模式学习笔记】解释器模式、迭代器模式案例详解(C++实现)
|
设计模式
23种设计模式-结构模式-组合模式(十一)
23种设计模式-结构模式-组合模式(十一)
23种设计模式-结构模式-组合模式(十一)
|
设计模式 算法 编译器
设计模式(二十四) 访问者模式
访问者模式提供了一种方法,将算法和数据结构分离。假设我们需要对一个数据结构进行不同的操作,就可以考虑使用访问者模式。访问者模式的要点在于,需要一个访问者接口,提供了一些重载方法来访问具体对象。
783 0
|
设计模式 存储 容器
设计模式之组合
设计模式之组合
133 0
设计模式之组合