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

    1.定义

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

    2.意识图

     

     

    3.实例代码

     1).懒汉式

    package com.wyl.singleton;
    
    /**
     * 单例模式--懒汉式
     * wuyanlin2016@163.com
     *  2017年12月26日
     */
    public class Example {
        /**
         * 懒汉式的特点:不得已时才创建对象
         */
        
        //私有构造函数
        private Example() {}
        
        //成员变量
        private static volatile Example instance;
        
        //提供对外获取对象的方法
        public static synchronized final Example getInstance() {
            if(instance!=null) return instance;
            synchronized (instance) {return new Example(); }
        }
        
    }

    2).饿汉式

    package com.wyl.singleton;
    
    /**
     * 单例模式--饿汉式
     * wuyanlin2016@163.com
     *  2017年12月26日
     */
    public class Model {
        /**
         * 特点:开始就创建对象,比较饥饿
         */
        
        //私有构造函数
        private Model() {}
        
        //初始化对象
        private static final Model INSTANCE=new Model();
        
        //提供对外访问方法
        public static final Model getInstance() {return INSTANCE;}
    }

    3).静态内部类式

    package com.wyl.singleton;
    
    /**
     * 单例模式--内部类
     * wuyanlin2016@163.com
     *  2017年12月26日
     */
    public class Mode {
        /**
         * 特点:有效防止线程安全问题
         */
        
        //私有构造方法
        private Mode() {}
        
        //静态内部类
        private static class Inner {
            private static final Mode INSTANCE = new Mode();
        }
        
        //提供对外访问的方法
        public static final Mode getInstance() {return Inner.INSTANCE;}
    }

    4).枚举式

    package com.wyl.singleton;
    
    /**
     * 单利模式--枚举
     * wuyanlin2016@163.com
     *  2017年12月26日
     */
    public enum EnumModel {
        INSTANCE;
        public void execute() {
            //execute other things
        }
    }
    
    //使用
    class Test{
        public static void main(String[] args) {
            EnumModel.INSTANCE.execute();
        }
    }

    5).单例与缓存

    package com.wyl.singleton;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 单例模式与缓存 wuyanlin2016@163.com 2017年12月26日
     */
    public class Extend {
        /**
         * map模拟缓存,控制实例个数
         */
    
        // 私有构造方法
        private Extend() {
        }
    
        // 默认key
        private static String DEFAULT_KEY = "CACHE";
    
        // 最大索引
        private static int MAX_INDEX = 3;
    
        // 初始索引
        private static int num = 1;
    
        // map充当缓存
        private static Map<String, Extend> caches = new HashMap<>();
    
        // 提供对外访问方法
        public static final Extend getInstance() {
            String realKey = DEFAULT_KEY + num;
            if (caches.get(realKey) == null)
                caches.put(realKey, new Extend());
            if (num++ > MAX_INDEX)
                num = 1;
            return caches.get(realKey);
        }
    
        // 测试
        public static void main(String[] args) {
            System.out.println("class1:" + Extend.getInstance());
            System.out.println("class2:" + Extend.getInstance());
            System.out.println("class3:" + Extend.getInstance());
            System.out.println("class4:" + Extend.getInstance());
            System.out.println("class5:" + Extend.getInstance());
            System.out.println("class6:" + Extend.getInstance());
        }
    }

    6).单例与缓存打印结果

    class1:com.wyl.singleton.Extend@4a6ca1a6
    class2:com.wyl.singleton.Extend@21e8bf76
    class3:com.wyl.singleton.Extend@3771ed5e
    class4:com.wyl.singleton.Extend@1896d2c2
    class5:com.wyl.singleton.Extend@4a6ca1a6
    class6:com.wyl.singleton.Extend@21e8bf76

    4.总结

    何时选用?

    当一个类的实例只要一个,且外部只能通过一个访问点访问的时候.

  • 相关阅读:
    Windows 8 应用的页面导航(1)
    开发 Windows 8 Bing地图应用(6)
    Windows 8 应用的页面导航(2)
    Windows 8 生命周期管理(4)
    删除DataTable重复列,只针对删除其中的一列重复的行
    Silverlight 数据库 Silverlight Database
    广告费用 会计处理及其改进
    Query to Join Delivery Details and MTL Material Table
    SAVEPOINT
    SYNCHRONIZE
  • 原文地址:https://www.cnblogs.com/wuyanlin/p/8118831.html
Copyright © 2011-2022 走看看