美文网首页
【设计模式】-- 单例模式

【设计模式】-- 单例模式

作者: 晴岚_Lanny | 来源:发表于2017-07-04 16:45 被阅读0次

    单例模式Singleton

    • 应用场合:有些对象只需要一个就足够了,如古代的皇帝、老婆
    • 作用:保证整个应用程序中某个实例有且只有一个
    • 类型:饿汉式、懒汉式

    下定义,什么是饿汉懒汉式?

    • 饿汉模式:只要类一加载,它就开始初始化,永远都是没有吃饱,所以叫饿汉式
    • 懒汉模式:当类加载的时候,比并没有初始化实例,而是在用户获取的时候才初始化,所以叫 懒汉式

    区别

    • 饿汉模式,类的加载比较慢,但是运行获取对象的速度比较快,线程是安全的
    • 懒汉模式,类的加载比较快,但是运行获取对象的速度比较慢,线程不安全

    饿汉式

    //饿汉模式
    public class EagerSingleton {
        
        //1、将构造方法私有化,不允许外部直接创建对象
        private EagerSingleton() {
            
        }
        
        //2、创建类的唯一实例,使用private static变成为类的静态成员
        private static EagerSingleton instance = new EagerSingleton();
        
        //3、提供一个获取实例的方法,使用public static修饰
        public static EagerSingleton getInstance(){
            
            return instance;
        }
    
    }
    

    懒汉式

    //懒汉模式
    public class LazySingleton {
        
        //1、将构造方法私有化,不允许外部直接创建对象
        private LazySingleton() {
            
        }
        
        //2、创建类的唯一实例,使用private static变成为类的静态成员
        private static LazySingleton instance;
        
        //3、提供一个获取实例的方法,使用public static修饰
        public static LazySingleton getInstance(){
            
            if(instance == null){
                instance = new LazySingleton();
            }
            
            return instance;
        }
    
    }
    

    测试

    //测试
    public class TestSingleton {
        
        public static void main(String[] args) {
            
            //饿汉式
            EagerSingleton s1 = EagerSingleton.getInstance();
            EagerSingleton s2 = EagerSingleton.getInstance();
            
            if (s1 == s2) {
                System.out.println("s1和s2是同一个实例");
            }else{
                System.out.println("s1和s2不是同一个实例");
            }
            
            //懒汉式
            LazySingleton s3 = LazySingleton.getInstance();
            LazySingleton s4 = LazySingleton.getInstance();
            
            if (s3 == s4) {
                System.out.println("s3和s4是同一个实例");
            }else{
                System.out.println("s3和s4不是同一个实例");
            }
        }
    
    }
    

    输出结果

    s1和s2是同一个实例
    s3和s4是同一个实例
    

    相关文章

      网友评论

          本文标题:【设计模式】-- 单例模式

          本文链接:https://www.haomeiwen.com/subject/ordxhxtx.html