设计模式————单例模式和有上限的多例模式

         单例模式和有上限的多例模式

      单例模式用一句话解释就是一个类只能产生一个对象

      我们都知道可以用一个new 关键字来产生一个对象,然后new的时候就会调用相应的构造函数

      到这里我想如何控制类实例个数为1应该有了一点思路了

      就是把构造函数设置为private,就可以阻止外部类创建对象了(这里不考虑利用反射机制去创建)

      我们举个例子顺便给出代码:

      一个国家只有一个领导人,然后有许多的公民。我们任何时候见到的领导都是一个。相对应的类图如下:

      

    对应的代码实现:

       

    

    运行结果:

        我是唯一的领导人

        我是唯一的领导人

    在给一个单例模式的通用类图

    

    

    代码为:

    

    这种形式的单例模式是线程安全的,这种模式也被称为饿汉模式

    下面的是一种线程不安全的单例模式,也被称为是懒汉模式

    

    现在就分析一下为什么这样的写法是线程不安全的

    该单例模式在低并发条件下不会出现问题。但是一旦系统压力过大,并发量增加就会出现一个内存中出现多个实例的情况

    比如一个线程执行到 singleton = new Singleton(),但是因为对象的初始化需要时间,所以暂时singleton还是为空

    刚好在这个时候另外一个线程执行了 singleton == null 的判断,此刻是满足条件的。所以就导致两个线程都获得了singleton对象,即在内存中出现了两个对象

    解决线程安全的方法第一种方法就是使用上面的饿汉模式去实现

    第二种解决方法就是在getInstance方法前面加上synchronized关键字。这种模式也叫线程安全的懒汉模式。

    具体实现如下:

    

    

    第三种解决方法为:在getInstance方法内部加上synchronized关键字

    具体实现如下:

    

     最后一个要说的就是单例模式的一个扩展:有上限的多例模式

       这样的好处是我们可以决定内存中有多少个实例,可以修正单例模式带来的性能问题。

     UML图如下:

      

              

      具体代码实现如下:

      

      

      测试代码:

      

    运行结果:

    

    到此单例模式以及扩展的有上限的多例模式讲解结束。

     

原文地址:https://www.cnblogs.com/HouJiao/p/5566058.html