zoukankan      html  css  js  c++  java
  • 设计模式————单例模式和有上限的多例模式

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

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

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

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

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

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

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

          

        对应的代码实现:

           

        

        运行结果:

            我是唯一的领导人

            我是唯一的领导人

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

        

        

        代码为:

        

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

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

        

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

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

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

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

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

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

        具体实现如下:

        

        

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

        具体实现如下:

        

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

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

         UML图如下:

          

                  

          具体代码实现如下:

          

          

          测试代码:

          

        运行结果:

        

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

         

  • 相关阅读:
    20145220&20145209&20145309信息安全系统设计基础实验报告(1)
    20145309信息安全系统设计基础第8周学习总结下
    20145309信息安全系统设计基础第8周学习总结上
    20145309信息安全系统设计基础第7周学习总结下
    20145309信息安全系统设计基础第7周学习总结上
    20145309信息安全系统设计基础第6周学习总结下
    第六周学习总结1
    20145309 《信息安全系统设计基础》第5周学习总结
    20145309信息安全系统设计基础第3周学习总结
    20145306 信息安全系统设计基础 第五周博客总结
  • 原文地址:https://www.cnblogs.com/HouJiao/p/5566058.html
Copyright © 2011-2022 走看看