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

    一个类只能有一个实例

    主要有两种,饿汉和懒汉模式。

    • 饿汉: 直接初始化
    • 懒汉: 使用的时候才初始化
    /**
     * @Classname 单例模式
     * @Description TODO
     * @Date 2021/9/23 17:24
     * @Created by huangsm
     */
    public class 单例模式 {
        /**
         * 一个类只能存在一个对象实例
         *
         * @param args
         */
        public static void main(String[] args) {
            //java代码典型使用,使用的是静态变量
            Runtime runtime = Runtime.getRuntime();
        }
    }
    
    /**
     * 饿汉模式(静态变量)
     */
    class SingletonStatic {
        //通过静态变量直接初始化
        private final static SingletonStatic instance = new SingletonStatic();
    
        //私有构造方法
        private SingletonStatic() {
        }
    
        //所有其他类通过此方法拿到静态变量
        public static SingletonStatic getInstance() {
            return instance;
        }
    }
    
    /**
     * 饿汉模式(静态代码块)
     */
    class SingletonStaticBlock {
        //创建内部对象
        private static SingletonStaticBlock instance;
    
        //在静态代码块中创建单例对象
        static {
            instance = new SingletonStaticBlock();
        }
    
        //私有构造方法
        private SingletonStaticBlock() {
        }
    
        //所有其他类通过此方法拿到静态变量
        public static SingletonStaticBlock getInstance() {
            return instance;
        }
    }
    
    /**
     * 懒汉模式(线程不安全)
     */
    class SingletonUnSafe {
        //创建内部对象
        private static SingletonUnSafe instance;
    
        //私有构造方法
        private SingletonUnSafe() {
        }
    
        //所有其他类通过此方法拿到静态变量
        public static SingletonUnSafe getInstance() {
            if (instance == null) {
                instance = new SingletonUnSafe();
            }
            return instance;
        }
    }
    
    /**
     * 懒汉模式(同步方法)
     */
    class SingletonSync {
        //创建内部对象
        private static SingletonSync instance;
    
        //私有构造方法
        private SingletonSync() {
        }
    
        //所有其他类通过此方法拿到静态变量
        public static synchronized SingletonSync getInstance() {
            if (instance == null) {
                instance = new SingletonSync();
            }
            return instance;
        }
    }
    
    /**
     * 懒汉模式(同步代码块)
     */
    class SingletonSyncBlock {
        //创建内部对象
        private static SingletonSyncBlock instance;
    
        //私有构造方法
        private SingletonSyncBlock() {
        }
    
        //所有其他类通过此方法拿到静态变量
        public static SingletonSyncBlock getInstance() {
            if (instance == null) {
                synchronized (SingletonSyncBlock.class) {
                    instance = new SingletonSyncBlock();
                }
            }
            return instance;
        }
    }
    
    /**
     * 双重检查
     */
    class SingletonDoubleCheck {
        //创建内部对象
        private static volatile SingletonDoubleCheck instance;
    
        //私有构造方法
        private SingletonDoubleCheck() {
        }
    
        //所有其他类通过此方法拿到静态变量
        public static SingletonDoubleCheck getInstance() {
            if (instance == null) {
                synchronized (SingletonSyncBlock.class) {
                    if (instance == null) {
                        instance = new SingletonDoubleCheck();
                    }
                }
            }
            return instance;
        }
    }
    
    /**
     * 静态内部类
     */
    class SingletonStaticClass {
        //创建内部对象
        private static volatile SingletonStaticClass instance;
    
        //私有构造方法
        private SingletonStaticClass() {
        }
    
        //所有其他类通过此方法拿到静态变量
        public static SingletonStaticClass getInstance() {
            return Singleton.INSTANCE;
        }
    
        private static class Singleton {
            private static final SingletonStaticClass INSTANCE = new SingletonStaticClass();
        }
    }
    
    /**
     * 枚举类
     */
    enum SingletonEnum {
        INSTANCE;
    }
    
    
  • 相关阅读:
    也谈用反射实现Enum→String映射:一种重视性能的方法【转载】
    C#对象的浅拷贝,深拷贝【转载】
    int转byte[],byte[]转int
    TF31003:您的用户帐户没有连接到 Team Foundation Server 的权限
    关于枚举的双语显示问题
    浅析C#深拷贝与浅拷贝
    反射枚举变量
    C#路径/文件/目录/I/O常见操作汇总(二)
    【转】正确理解ThreadLocal
    【转】JSP的九个隐含对象
  • 原文地址:https://www.cnblogs.com/steven158/p/15650101.html
Copyright © 2011-2022 走看看