• 设计模式笔记之三(单例模式)


    单例模式

    单例模式可以说是最简单的设计模式了,当我们需要保持状态一致,或者是缩减资源开销的时候我们都会用到单例模式。

    就如我们的实验室有三个老总,以前富裕的时候每个老总都有一个女秘书

    class NvMiShu {
    
    }
    
    public class Singleton {
        public static void main(String[] args) {
            // 老总A的秘书
            NvMiShu mishuA = new NvMiShu();
    
            // 老总B的秘书
            NvMiShu mishuB = new NvMiShu();
    
            // 老总C的秘书
            NvMiShu mishuC = new NvMiShu();
        }
    }

    但是最近市场不景气,我们的人+衣服套件不好卖了,老总们只能共用一位秘书了,所以辞退两个秘书后,剩下的一个秘书只能改变工作机制才能满足三个老总的需求(请宅男程序员们不要脑补,我是一个正直的程序猿),

    class NvMiShu {
        private static NvMiShu miShu = new NvMiShu();
    
        private NvMiShu() {
        }
    
        public static NvMiShu getInstance() {
            return miShu;
        }
    }
    
    public class Singleton {
        public static void main(String[] args) {
            // 老总A的秘书
            NvMiShu mishuA = NvMiShu.getInstance();
            // 老总B的秘书
            NvMiShu mishuB = NvMiShu.getInstance();
            // 老总C的秘书
            NvMiShu mishuC = NvMiShu.getInstance();
            // 其实老总们的秘书只有一个,只是不同老总招唤的时候穿上不同的齐X小短裙
        }
    }

    但是当我们的经济更加的拮据的时候,有人提出当老总们都不需要秘书的时候,我们其实不需要秘书啊,只有当有一个老总有需求的时候,招一个秘书好了,于是秘书处又做了改变:

    class NvMiShu {
        private static NvMiShu miShu;
    
        private NvMiShu() {
        }
    
        public static NvMiShu getInstance() {
            if (miShu == null) {
                miShu = new NvMiShu();
            }
            return miShu;
        }
    }

    如此这般了以后,很久的时间工作得都很顺利,老总们都能得到秘书很好的服务。

    直到有一次,A老总需要秘书的服务,当时前一个秘书因为长时间得不到老总的招唤已经辞退了,所以秘书处的人就去招人了,

    但是这时候B老总也需要秘书的服务,秘书处还没有秘书所以又去招人了,这下一下子招回来两个秘书,问题就出现了,所以秘书处只能再次改变工作机制

    class NvMiShu {
        private static NvMiShu miShu;
    
        private NvMiShu() {
        }
    
        public synchronized static NvMiShu getInstance() {
            if (miShu == null) {
                miShu = new NvMiShu();
            }
            return miShu;
        }
    }

    这样当多个老总同时招呼秘书的时候,就得排队等上一个老总用完才轮到下一个老总用。这又导致了老总们等待的时间变长,老总的意思是当没有秘书的时候我们排队等等也行,但是如果有秘书了,我们就不需要排队了,可以一起用啊(我真不想说的这么不符合我的风格,但是事实就是这样啊)。 秘书处只能又做了一些改变。

    class NvMiShu {
        private static NvMiShu miShu;
        private static final Object o = new Object();
    
        private NvMiShu() {
        }
    
        public static NvMiShu getInstance() {
            if (miShu == null) {// #1
                synchronized (o) {
                    if (miShu == null) {// #2 #1和#2处两次判断是为了避免多线程同时调用,都通过#1处的校验
                        miShu = new NvMiShu();
                    }
                }
            }
            return miShu;
        }
    }

    以下是完整的一个单例模式,

    View Code
    class NvMiShu {
        private static NvMiShu miShu;
        private static final Object o = new Object();
    
        private NvMiShu() {
        }
    
        public static NvMiShu getInstance() {
            if (miShu == null) {// #1
                synchronized (o) {
                    if (miShu == null) {// #2 #1和#2处两次判断是为了避免多线程同时调用,都通过#1处的校验
                        miShu = new NvMiShu();
                    }
                }
            }
            return miShu;
        }
    }
    
    public class Singleton {
        public static void main(String[] args) {
            // 老总A的秘书
            NvMiShu mishuA = NvMiShu.getInstance();
            // 老总B的秘书
            NvMiShu mishuB = NvMiShu.getInstance();
            // 老总C的秘书
            NvMiShu mishuC = NvMiShu.getInstance();
            // 其实老总们的秘书只有一个,只是不同老总招唤的时候穿上不同的齐X小短裙
        }
    }

    因为单例模式比较简单,以上只为搏君一笑罢了。

  • 相关阅读:
    v:bind指令对于传boolean值的注意之处
    vue项目依赖的安装
    直接将文件存放到服务器tomcat中,就可以直接访问文件等
    什么情况下用vue.use方法
    创建Vue项目及其内容分析
    linux安装nginx以及如何启动,暂停,停止操作
    vue项目怎么搭建到云服务器上
    Nginx安装
    UNP学习笔记(第三十章 客户/服务器程序设计范式)
    UNP学习笔记(第二十六章 线程)
  • 原文地址:https://www.cnblogs.com/biglaojiang/p/3069349.html
Copyright © 2020-2023  润新知