美文网首页产品
设计模式之单例模式

设计模式之单例模式

作者: Ritchie_Li | 来源:发表于2022-10-12 20:11 被阅读0次

    单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

    单例模式同时解决了两个问题, 所以违反了单一职责原则

    1. 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例数量? 最常见的原因是控制某些共享资源 (例如数据库或文件) 的访问权限。

    它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。

    注意, 普通构造函数无法实现上述行为, 因为构造函数的设计决定了它必须总是返回一个新对象。

    2. 为该实例提供一个全局访问节点。 还记得你 (好吧, 其实是我自己) 用过的那些存储重要对象的全局变量吗? 它们在使用上十分方便, 但同时也非常不安全, 因为任何代码都有可能覆盖掉那些变量的内容, 从而引发程序崩溃。

    和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。

    还有一点: 你不会希望解决同一个问题的代码分散在程序各处的。 因此更好的方式是将其放在同一个类中, 特别是当其他代码已经依赖这个类时更应该如此。

    如今, 单例模式已经变得非常流行, 以至于人们会将只解决上文描述中任意一个问题的东西称为单例

    所有单例的实现都包含以下两个相同的步骤:

    将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符。

    新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。 此后所有对于该函数的调用都将返回这一缓存对象。

    如果你的代码能够访问单例类, 那它就能调用单例类的静态方法。 无论何时调用该方法, 它总是会返回相同的对象。

    实现方式

    在类中添加一个私有静态成员变量用于保存单例实例。

    声明一个公有静态构建方法用于获取单例实例。

    在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。

    将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。

    检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用。

    Java 示例代码如下:

    public class SingletonPattern {

        public static void main(String[] args) {

            // Singleton singleton1 = new Singleton();

            Singleton singleton1 = Singleton.getInstance();

            Singleton singleton2 = Singleton.getInstance();

            Singleton singleton3 = Singleton.getInstance();

            System.out.println(singleton1.getNumber() + " " + singleton2.getNumber() + " " + singleton3.getNumber());

            singleton1.setNumber(528);

            System.out.println(singleton1.getNumber() + " " + singleton2.getNumber() + " " + singleton3.getNumber());

        }

    }

    class Singleton {

        private int number = 2022;

        public void setNumber(int number) {

            this.number = number;

        }

        public int getNumber() {

            return number;

        }

        private static Singleton instance = new Singleton();

        private Singleton() {}

        public static Singleton getInstance() {

            return instance;

        }

    }

    相关文章

      网友评论

        本文标题:设计模式之单例模式

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