如何写一个简单的单例模式?
1、单例模式(Singleton) ,属于最常见的设计模式之一,大部分系统都会用到,目的是为了维护系统中唯一的一个实例。
2、单例设计模式理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫单例模式。下面的示例中如果每个类都创建一个 Logger 实例,就可能造成日志内容被覆盖的情况。
3、单例模式(Singleton Pattern)是一个比较简单的模式。定义:确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。
4、单例模式作为常见的设计模式之一,在java的项目开发中会时常的用到。Java Singleton模式即保证在JVM运行时,一个类Class只有一个实例存在。单例模式有什么好处呢? 最简单的一个例子就是网站计数器的设计了。
5、单例模式大致有五种写法,分别为懒汉,恶汉,静态内部类,枚举和双重校验锁。
6、总之,选择单例模式就是为了避免不一致状态,避免政出多头。首先看一个经典的单例实现。
设计模式之单例模式
单例设计模式理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫单例模式。下面的示例中如果每个类都创建一个 Logger 实例,就可能造成日志内容被覆盖的情况。
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
单例模式作为常见的设计模式之一,在java的项目开发中会时常的用到。Java Singleton模式即保证在JVM运行时,一个类Class只有一个实例存在。单例模式有什么好处呢? 最简单的一个例子就是网站计数器的设计了。
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。
为什么用枚举类来实现单例模式越来越流行?
枚举类型最大的特点就是:构造函数是private修饰的,也就是不能对其进行new,对象的实例都是预定义的,也就是在类加载的时候都是定义好了的,不会给其它调用去创建实例的机会。
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。
枚举单例模式占用的内存是静态变量的两倍,所以一般都不使用enum来实现单例。单例有饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式这几种形式。
枚举实现单例避免被反射破坏的原因
1、枚举本身就是单例模式。避免了反射和反序列化的漏洞。调用的效率比较高,线程安全,实现简单。唯一的缺点是没有实现延时加载。
2、由于反序列化后的对象是重新new出来的,所以这就破坏了单例。(使用双重校验锁实现的单例其实是存在一定问题的,就是这种单例有可能被序列化锁破坏)普通类的反序列化是通过反射实现的,枚举类的反序列化不是通过反射实现的。
3、因为枚举类没有构造方法,可以防止反序列化操作。
4、也就是说大脑中才能有感觉。反射弧的神经中枢有神经与大脑相连,可以将兴奋传递到大脑,大脑形成感觉。反射弧中感受器、传入神经、神经中枢三者中任何一个受到破坏,都不可能让兴奋传递到大脑,也就无法形成感觉。
5、使用反射再次创建对象后运行截图如下:可以看出单例模式又再次被破坏了。为了解决序列化和反序列化破坏单例模式的问题,我们可以定义一种称为 readResolve() 的特殊序列化方法。
单例模式没有抽象层
缺点在于单例模式没有接口,也没有抽象层,扩展性性差,如需扩展,需在原有代码上进行修改。
由于单利模式中没有抽象层,因此单例类的扩展有很大的困难,这就要求单例类从一开始就完成大量所需功能,可能会使得单例类的职责过重,在一定程度上违背了“单一职责原则”。
单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能用mock的方式虚拟一个对象。 单例模式与单一职责原则有冲突。
想作为一种通信媒介,在不建立直接关联的条件下让不相关的两个程序进行通信,尤其是多线程。第二点,我说的有些抽象,简单讲吧,就类似于大家基于一个黑板讨论东西,而不关心参与讨论的对象。单例就取了黑板的作用。
单例模式实现方式有以下五种:饿汉模式。线程安全,调用效率高,不能延时加载。懒汉模式。线程安全,调用效率不高,能延时加载。双重检测锁模式。由因JVM底层模型原因,偶尔会出问题,不建议使用。
如何对枚举类型实现的单例模式进行mock
懒汉式,线程安全为了解决上面的问题,最简单的方法是将整个getInstance()方法设为同步(synchronized)。
在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。
这是一种最简单的实现方式,基于枚举类型的单例实现。这种实现方式是通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。上面的单例类对象是进程唯一的,一个进程只能有一个单例对象。
单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能用mock的方式虚拟一个对象。单例模式与单一职责原则有冲突。
首先,枚举型Light是个实实在在的类。继承自基类EnumLight。然后在你不知情的情况下,偷偷加了static final修饰词。然后三个枚举实例GREEN, YELLOW, RED也确确实实是Light的实例。然而前面也加上了static final。