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继续创建新的实例对象。

  • 相关阅读:
    java Socket Tcp 浏览器和服务器(二)
    java Socket Tcp 浏览器和服务器(一)
    java Socket Tcp示例三则(服务端处理数据、上传文件)
    java Socket Udp聊天
    centos 图形界面和命令行界面切换
    python 文件中的中文编码解决方法
    PostgreSQL与MySQL比较(转)
    Python 的开发环境
    Windows 下 pip和easy_install 的安装与使用
    Linux 下的下载文件命令
  • 原文地址:https://www.cnblogs.com/maying3010/p/6477141.html
Copyright © 2011-2022 走看看