zoukankan      html  css  js  c++  java
  • 设计模式--单例模式

    设计模式--单例模式

    1.概述


    1.1 定义

    "Ensure a class has only one instance,and provide global point of access to it"(确保该类只有一个实例,而且想整个系统提供这个实例)

    1.2 意义

    由于单例模式在内存中只有一个实例对象,节约内存空间,减少了对象创建、GC时的系统消耗。

    1.3 应用

    单例模式(Singleston Pattern)经常能够在程序中看见,例如Spring框架中默认Bean为Singleton.

    2.详解

    注:以下代码都没有考虑反射强行创建对象。
    单例模式的通用代码

     

     1 public class Singleton {
     2     // 静态的对象实例
     3     private static Singleton instance = new Singleton();
     4     // 静态方法获得该类的实例对象
     5     public static Singleton getInstance(){
     6         return instance;
     7     }
     8     // 私有的构造方法,避免其他类创建该类的对象。
     9     private Singleton(){}
    10 }

     

    有一点小小的问题:当我们访问该类的其他静态方法、静态域会造成该类的实例化,浪费内存空间。

    ~~~~~~~~~~~~~~~~~~~~~我是无聊的分割线~~~~~~~~~~~~~~~~~~~~

    比上面好一点的单例模式

     1 public class Singleton {
     2     // 私有的构造方法,避免其他类创建该类的实例对象
     3     private Singleton(){}
     4     // 静态方法获得该类的实例对象
     5     public static Singleton getInstance(){
     6         return SingletonInstance.instance;
     7     }
     8     // 内部类初始化实例对象
     9     private static class SingletonInstance{
    10         static Singleton instance = new Singleton();
    11     }
    12 }

    ~~~~~~~~~~~~~~~~~~~~~我是萌萌的分割线~~~~~~~~~~~~~~~~~~~~

    差的单例模式

     1 public class Singleton {
     2     // 静态的实例对象
     3     private static Singleton instance;
     4     // 静态方法获得该类的实例对象
     5     public static Singleton getInstance(){
     6         if(instance == null){
     7             instance = new Singleton();
     8         }
     9         return instance;
    10     }
    11     // 私有的构造方法,避免其他类创建该类的实例对象
    12     private Singleton(){}
    13 }

    问题:当高并发时,系统实际上会产生多了实例对象。如线程A执行到instance = new Single(),可能还没有获得对象(对象初始化需要时间)时,而线程B执行到instance == null判断为true继续创建新的实例对象。

  • 相关阅读:
    winform 通过左右键,或enter键做类似Tab键的功能
    向表中插入查询结果
    创建Oracle job的一些注意事项
    多数据库独立主机的配置
    图形码验证
    JavaScript中的trycatchfinally
    ASP.Net生成后台脚本的问题的解决办法
    10个你未必知道的CSS技巧
    学习JQuery的$.Ready()与OnLoad事件比较[转]
    风雨20年:我所积累的20条编程经验[csdn]
  • 原文地址:https://www.cnblogs.com/maying3010/p/6477141.html
Copyright © 2011-2022 走看看