zoukankan      html  css  js  c++  java
  • Java单例模式

    Java单例模式

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

    解决:一个全局使用的类频繁地创建与销毁。

    使用:当您想控制实例数目,节省系统资源的时候。

    解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

    关键:构造函数是私有的。

     

    优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

          2、避免对资源的多重占用(比如写文件操作)。

    缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

    代码示例

    1、懒汉模式

    /**
     * 懒汉式:线程不安全
     * @author 943567518@qq.com
     *
     */
    public class SingletonA1 {
    
        /*
         * 私有静态变量
         */
        private static SingletonA1 instance;
        
        /**
         * 空构造方法
         */
        private SingletonA1(){}
        
        /**
         * 获取实例
         * @return
         */
        public static SingletonA1 getInstance(){
            if(instance==null){
                instance=new SingletonA1();
            }
            return instance;
        }
        
    }
    /**
     * 懒汉式:线程安全
     * @author 943567518@qq.com
     *
     */
    public class SingletonA2 {
        /*
         * 私有静态变量
         */
        private static SingletonA2 instance;
        
        /**
         * 空构造方法
         */
        private SingletonA2(){}
        
        /**
         * 获取实例-加锁
         * @return
         */
        public static synchronized SingletonA2 getInstance(){
            if(instance==null){
                instance=new SingletonA2();
            }
            return instance;
        }
    }

    2、饿汉模式

    /**
     * 饿汉式:线程安全
     * @author 943567518@qq.com
     *
     */
    public class SingletonB {
        /*
         * 私有静态变量
         */
        private static SingletonB instance=new SingletonB();
        
        /**
         * 空构造方法
         */
        private SingletonB(){}
        
        /**
         * 获取实例
         * @return
         */
        public static SingletonB getInstance(){
            return instance;
        }
    }

    3、双重检验

    /**
     * 双重检验:线程安全
     * @author 943567518@qq.com
     *
     */
    public class SingletonC {
        /*
         * 私有静态变量
         */
        private static volatile SingletonC instance;
        
        /**
         * 空构造方法
         */
        private SingletonC(){}
        
        /**
         * 获取实例
         * @return
         */
        public static SingletonC getInstance(){
            if(instance==null){
                synchronized(SingletonC.class){
                    if(instance==null){
                        instance=new SingletonC();
                    }
                }
            }
            return instance;
        }
        
    }

    4、静态内部类

    /**
     * 静态内部类:线程安全
     * @author 943567518@qq.com
     *
     */
    public class SingletonD {
        
        private SingletonD(){}
        
        public static SingletonD getInstance(){
            return SingletonInner.INSTANCE;
        }
        
        /**
         * 内部类
         * @author Administrator
         *
         */
        private static class SingletonInner{
            private static final SingletonD INSTANCE=new SingletonD();
        }
    }
  • 相关阅读:
    Windows Messenger 5.1 [Download from Microsoft]
    Building Web Parts for SPS读书笔记(2)
    Resources for KM & SharePoint Portal
    Microsoft.SharePoint.Menu Web Part [Free]
    忽略PNG透明区域的事件(AS/Flash)
    android webView 使用方法
    Android开发之Android开发规范(初)
    Android 下使用 JSON 实现 HTTP 请求
    html5 canvas 简单画板实现代码
    设定麦克风的声音品质
  • 原文地址:https://www.cnblogs.com/xmqa/p/8631679.html
Copyright © 2011-2022 走看看