zoukankan      html  css  js  c++  java
  • 23 种设计模式—单例模式

    一、单例模式概述

      单例模式(Singleton-Pattern)是 Java 中最简单的设计模式之一,这种类型的设计模式属于对象创建型模式。

      作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

     

    二、理解单例模式

      某些类创建对象是非常耗时耗内存和复杂的,这种类创建的对象我们称之为重量级对象(反之,轻量级对象),如果需要使用重量级类,一般把这个类设计为单例对象模式。

      单例对象模式好处有:

          1)保证对象在内存仅有一个,减少内存开销

          2)使用者不用考虑创建细节,使用方便

          3)可以控制对象的创建时刻

      代码实现单例模式的关键点:

        1)这个类在整个 JVM 中仅有一个对象实例

            Java 中对象的创建方式有:

              a)new 

              b)反射(reflect)

              c)反序列化(deserialize)

              d)克隆(clone)

        2)提供一个访问它的全局访问点

              a)公开的静态变量(不利于扩展)

              b)一个公开的静态方法,返回唯一实例

     

    三、实现单例模式方式

      (1)饿汉式:立即创建、线程安全

    package 饿汉式;
    
    public class SingletonClass {
        
        //私有静态变量,创建唯一实例   final:避免再次赋值(可加可不加)
        private static final SingletonClass ONLY=new SingletonClass();
    
        //私有构造方法,屏蔽外部的 new(外部无法访问此类)
        private SingletonClass(){}
        
        //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
        public static SingletonClass getInstance(){
            //...其他代码
            return ONLY;
        }
        
        public void f(){
            System.out.println("恶汉式单例模式");
        }
    }

      

      (2)懒汉式:延时创建、线程不安全

    package 懒汉式;
    
    public class SingletonClass {
        
        //私有静态变量,保存唯一实例
        private static  SingletonClass ONLY;
    
        //私有构造方法,屏蔽外部的 new(外部无法访问此类)
        private SingletonClass(){}
        
        //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
        public  static SingletonClass getInstance(){
            if(ONLY==null){
                //...线程不安全
                ONLY=new SingletonClass();
            }
            //...其他代码
            return ONLY;
        }
        
        public void f(){
            System.out.println("懒汉式单例模式");
        }
    }

    //缺点:多线程情况下不安全

      (3)加锁的懒汉式:延时加载、线程安全、同步情况下效率低

    package 加锁懒汉式;
    
    public class SingletonClass {
        
        //私有静态变量,保存唯一实例
        private static  SingletonClass ONLY;
    
        //私有构造方法,屏蔽外部的 new(外部无法访问此类)
        private SingletonClass(){}
        
        //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
        public synchronized static SingletonClass getInstance(){
            if(ONLY==null){
                //...线程不安全(解决方案:synchronized)
                ONLY=new SingletonClass();
            }
            //...其他代码
            return ONLY;
        }
        
        public void f(){
            System.out.println("加锁懒汉式单例模式");
        }
    }

    //缺点:同步情况下效率低,即当
    SingletonClass 的对象已经被创建,多线程情况下因为有 synchronized 存在,还需要等待解锁。

     

    eclipse 中字母大小写转换快捷键:

        ctrl+shift+x   转为大写  

           ctrl+shift+y   转为小写

  • 相关阅读:
    MFC中添加自己定义的消息
    动态创建的list control添加消息响应
    关于CString的奇怪问题
    如何去掉按钮在输入焦点切换时所产生的闪烁
    wince中将自己的应用程序编译到内核并开机启动的一种方法
    wince下圆角矩形按钮的实现
    关于error C2471:无法更新程序数据库的错误的解决方法
    关于烧写开机logo之后导致无法启动系统的问题
    利用IdHTTP进行多线程下载
    TEdit 控件的提示,就像 IE7 的地址输入栏一样
  • 原文地址:https://www.cnblogs.com/wxdestiny/p/9752267.html
Copyright © 2011-2022 走看看