23种内功之--单例模式

作者: MinuitZ | 来源:发表于2017-10-26 15:51 被阅读13次

    单例模式是最简单的设计模式 , 甚至在学校中就可以学到 , 也是很多初级程序员(比如我)会的唯一的设计模式.那么这种设计模式有什么用呢 , 具体怎么实现?

    基础概念

    • 因为内存原因 , 希望整个系统只有一个全局对象, 有利于对整个系统的协调管理 , 比如SharedPreference , 构造多个实例过于浪费
    • 定义:一个类只有一个实例 , 并向整个系统提供

    关键点

    1. 构造函数不开放
    2. 通过静态方法来返回对象
    3. 单例类有且只有一个

    单例模式的几种实现

    1. 饿汉式

    public class TestTwo {
        //  在初始化静态变量时就创建对象 , 会在初始化时候稍慢一些
        private static TestTwo instance=new TestTwo();
        private TestTwo(){
        }
    
        public static TestTwo getInstanceHunger(){
            return instance;
        }
    }
    

    2. 饱汉式

    public class TextOne {
        private static TextOne instance;
    
        private TextOne(){
    
        }
        // 在使用该方法时才开始创建对象
        public static synchronized TextOne getInstanceFull(){
            if (instance==null){
                instance=new TextOne();
            }
            return instance;
        }
    }
    

    使用TestOne.getInstance()方法是才会开始创建对象 , 对于并发不是很高的类 , 这种方法完全没有问题 .但是在高并发下会创建多个实例 , 失去单例的意义

    3. DLC模式

    public class TestThree {
        private volatile static TestThree instance=null;
    
        private TestThree(){
        }
    
        public static TestThree getInstance(){
            if (instance==null){  //避免不必要的同步
                synchronized (TestThree.class){
                    if (instance==null){  // 验证赋值
                        instance=new TestThree();
                    }
                }
            }
            return instance;
        }
    }
    

    首先在这里加入了两个判断 , 第一层是为了避免不必要的同步, 第二层是为了在null的情况下获取实例.
    然后要注意volatile关键字, 在读取volatile类型的变量时总会返回最新写入的值, 所以即使发生了指令乱序 , 也不会干扰到instance的赋值 .

    4. 静态内部类

    public class TestFour {
        private TestFour(){}
        public static TestFour getInstance(){
            return SingletonHolder.instance;
        }
    
        // 内部类
        private static class SingletonHolder{
            private static final TestFour instance=new TestFour();
        }
    }
    

    相关文章

      网友评论

        本文标题:23种内功之--单例模式

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