美文网首页
设计模式(java)- 单例模式

设计模式(java)- 单例模式

作者: JASONGAOJS | 来源:发表于2018-09-25 22:59 被阅读0次

    之前学习是简单工厂模式、工厂方法模式、抽象工厂模式,复习一下

    简单工厂模式

    简单工厂模式大概就是创建一个简单工厂类,由工厂类实例化对象。由参数决定实例化那个类

    工厂方法模式

    创建一个抽象工厂类,里面包含一个抽象方法。由这个工厂去生产产品,具体的就是实现类实现工厂,并完成抽象方法的功能实现(如月饼抽象生产类,南方月饼类实现月饼抽象生产类,北方月饼实现月饼抽象生产类,等等)。调用不是由参数决定,是由创建者决定

    抽象工厂模式

    创建抽象工厂类生产工厂,创建抽象产品类生产产品,并各自实现。形成产品族(一个大的家族)
    对于之前的理解模糊可以看这个:https://www.zhihu.com/question/20367734

    一、 对单例模式的理解

    单例模式就像太阳一样,只有一个。在使用的时候,只能实例化一次。不能多次实例化。
    二、代码实现

    // 单例模式  太阳(synchronized,重量级)
    public class sun {
        private static sun s = null;
        
        private sun() {}
        // 单例模式  这种方式多线程时会出现混乱的情况,不建议使用
        public static sun getSun() {
            if (s == null) {
                s = new sun();
            }
            return s;
        }
        // (同步方法)添加同步锁,在不考虑性能的时候可以使用该方法
        public static synchronized sun getSunSyn() {
            if (s == null) {
                s = new sun();
            }
            return s;
        }
    }
    // 月亮(双重检查加锁)
    class moon {
        // volatile 当moon初始化为实例时,能保证多个线程正确的处理moon变量
        private volatile static moon m;
        
        private moon() {};
        //  减少synchronized的使用
        public static moon getMoon() {
            if (m == null) {
                synchronized (moon.class) {
                    if (m == null) {
                        m = new moon();
                    }
                }
            }
            return m;
        }
    }
    // 地球(急切)
    class earth{
        // 在静态初始化器中创建单件,这段代码保证了线程安全
        private static earth e = new earth();
        
        private earth(){};
        // 在jvm 加载这个类的时候创建此唯一的单例模式。
        public static earth getEarth() {
            return e;
        }
    }
    

    三、UML类图

    单例模式

    四、笔记

    oo设计原则

    封装变化

    多用组合、少用继承

    针对接口编程、不针对实现编程

    为对象之间的松耦合设计而努力

    类应该对扩展开发、修改关闭

    依赖抽象、不要依赖具体类
    单例模式定义:
    确保一个类只有一个实例,并提供全局访问点

    相关文章

      网友评论

          本文标题:设计模式(java)- 单例模式

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