zoukankan      html  css  js  c++  java
  • 23种设计模式(1)-单例模式

    定义:

      单例模式,是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类,通过单例模式可以保证系统中一个类只有一个实例,即一个类只有一个对象实例.

    特点:

      1.单例类只能有一个实例

      2.单例类必须自己创建自己的唯一实例

      3.单例类必须给其他对象提供这一实例

    单例模式要点:

      1.私有的构造方法

      2.指向自己实例的私有静态引用

      3.以自己实例为返回值的静态的公有的方法

    单例模式根据实例化对象的时机的不同分为两种:

      1.一种是饿汉式单例,一种是懒汉式单例.

      饿汉式单例在单例被加载的时候,就实例化一个对象交给自己的引用;而懒汉式单例在调用取得实例方法的时候才会实例化对象

      

    public class Singleton{
        private static Singleton singleton = new Singleton();
        private Singleton(){}
        public static Singleton getInstance(){
            return singleton;
        }      
    }

      懒汉式单例

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

    单例模式还有一种双重锁的形式;

    public class Singleton{
         private static volatile Singleton instance = null;
         private Singleton(){
          //do something
         }
         public static Singleton getInsstance(){
               if(instance==null){
                   synchronized(SingletonClass.class){
                        if(instance==null){
                             instance = new Singleton();
                        }
                   }
               }
               return instance;
          }
    }

    如果面对高并发的情况,而且采用的是懒汉式模式,最好的选择就是双重判断加同步的方式.

    单例模式的优点:

      1.在内存中只有一个对象,节省内存空间

      2.避免频繁的创建销毁对象,可以提高性能

      3.避免对共享资源的多重占用

      4.可以全局访问

    单例模式的缺点:

      1.扩展困难,由于getInstance 静态函数没有办法生成子类的实例,如果要扩展,只有重写哪个类.

      2.隐式使用引起类结构不清晰

      3.导致程序内存泄漏的问题

    单例模式注意事项

      只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新的对象

      不要做断开单例类对象与类中静态引用的危险操作

      多线程使用单例使用共享资源时,注意线程安全的问题

  • 相关阅读:
    【HTTP】长连接和短连接
    HTTP/1.1 持久连接 persistent connection
    浅谈Websocket、Ajax轮询和长轮询(long polling)
    web通信之跨文档通信 postMessage
    HTML5 postMessage 和 localStorage 实现窗口间通信
    CORS 和 JSONP
    【转】js中几种实用的跨域方法原理详解
    [跨域]前端解决跨域问题
    RFC1867 HTTP file upload
    Multipart/form-data POST文件上传
  • 原文地址:https://www.cnblogs.com/1218-mzc/p/8045974.html
Copyright © 2011-2022 走看看