单列设计模式

简介: 单列设计模式

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

避免对象不一致的状态

引入问题:例如一家公司只有一个打印机,但是有多个部门,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);
    }
}


相关文章
|
3月前
|
设计模式 XML 存储
何时使用复合设计模式?
【8月更文挑战第22天】
32 0
|
6月前
|
设计模式 Java
浅谈设计模式 - 组合模式(十二)
浅谈设计模式 - 组合模式(十二)
85 0
|
设计模式 存储
组合设计模式解读
组合设计模式解读
|
设计模式 Java
浅谈设计模式 - 迭代器模式(十一)
迭代器模式通常只需要知道该模式的实现原理和了解结构图即可,在设计模式当中自己实现的情况几乎是没有的,所以这个模式简单的过一遍。
88 0
|
设计模式
【设计模式】【第八章】【商品多级分类目录场景】【组合模式+访问者模式】
创建design-demo项目 创建ItemController 创建ItemService 创建ItemServiceimpl 创建ItemVisitor 创建DelItemVisitor 创建AddItemVisitor 创建ProductItem 创建AbstractProductItem 创建MockDb
107 0
|
设计模式
23种设计模式-结构模式-组合模式(十一)
23种设计模式-结构模式-组合模式(十一)
23种设计模式-结构模式-组合模式(十一)
|
设计模式 Java uml
设计模式轻松学【十一】装饰模式
如果要扩展一些功能,我们可以采用装饰模式来实现。装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰者模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。
134 0
设计模式轻松学【十一】装饰模式
|
设计模式 存储 容器
设计模式之组合
设计模式之组合
130 0
设计模式之组合
|
JavaScript 前端开发
设计模式应用举例
纸上得来终觉浅,学习设计模式,看了很多书,但是始终还是觉得不如直接看例子来的更加客观具体,下面主要记录了js中的几个常见的设计模式举例,供自己以后复习的时候可以直接通过例子更快更好的理解设计模式。 单例模式 保证一个类仅有一个实例,并提供一个全局访问入口 var getSingleton = fun...
1165 0
入门设计模式之合成模式
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80866713 ...
766 0