• 设计模式——单例模式


    • 饿汉模式
    package test.design.singleton;
    
    /**
     * 单例模式(饿汉模式)
     * 使用场景:当类只有一个实例,且可以从一个固定的点访问时,保证实例只有一个
     * 优点:在类加载时就完成了初始化,线程安全
     * Created by Z on 2017/4/17.
     */
    public class EagerSingleton {
    
        //静态变量
        private static EagerSingleton eagerSingleton = new EagerSingleton();
    
        /**
         * 私有构造函数
         * 不允许被外部所创建 保证只有一个实例
         */
        private EagerSingleton() {
            System.out.println("GetInstance");
        }
    
        public static EagerSingleton getInstance() {
            return eagerSingleton;
        }
    
        public void print() {
            System.out.println("This is EagerSington");
        }
    
    }
    
     class Test {
    
        public static void main(String[] args) {
            EagerSingleton.getInstance().print();
            System.out.println(EagerSingleton.getInstance());
    
    //        这样就会报错 因为构造函数是私有的不允许被外部创建
    //        EagerSingleton es =new EagerSingleton();
        }
    }

    输出:

    GetInstance
    This is EagerSington
    test.design.singleton.EagerSingleton@4a574795
    • 懒汉模式
    package test.design.singleton;
    
    /**
     * 单例模式(懒汉模式)
     * 使用场景同饿汉模式
     * 优点:在使用时加载,节省内存
     * Created by Z on 2017/4/17.
     */
    public class LasySingleton {
    
        private static LasySingleton lasySingleton = null;
    
        private LasySingleton() {
            System.out.println("GetInstance");
        }
    
        /**
         * 线程同步
         * 不加synchronized线程是不安全的
         * @return
         */
        public static synchronized LasySingleton getInstance() {
            if (lasySingleton == null) {
                lasySingleton = new LasySingleton();
            }
            return lasySingleton;
        }
    
        public void print() {
            System.out.println("This is LasySingleton");
        }
    }
    
    class TestLasySingleton {
        public static void main(String[] args) {
            LasySingleton.getInstance().print();
            System.out.println(LasySingleton.getInstance());
    
    //        这样就会报错 因为构造函数是私有的不允许被外部创建
    //        LasySingleton ls =new LasySingleton();
    
        }
    }

    输出:

    GetInstance
    This is LasySingleton
    test.design.singleton.LasySingleton@4a574795
    //和上一个分配的内存地址是一样的...
    • 总结

       饿汉模式:空间换时间;懒汉模式:时间换空间。一般用饿汉模式就可以了。

  • 相关阅读:
    Oracle11gR2 INDEX FAST FULL SCAN 成本计算
    SELECT MIN(ID),MAX(ID) FROM TABLE 优化问题
    一次帮助网友优化的SQL案例
    Oracle11gR2 全表扫描成本计算(非工作量模式noworkload)
    & 符号在 SQLPLUS 的转义
    通过设置SQLPLUS ARRAYSIZE(行预取)加快SQL返回速度
    [linux] 如何让你自己写的程序也支持自动补全(bash环境)
    linux 查看系统版本 命令
    ubuntu右键添加打开终端的快捷菜单
    ubuntu右键添加打开终端的快捷菜单
  • 原文地址:https://www.cnblogs.com/6324/p/6723808.html
Copyright © 2020-2023  润新知