java 单例设计模式 详解

xiaoxiao2022-07-05  41

java 单例设计模式

概述: 像Windows系统的任务管理器一样,你无论打开多少次,始终显示的一个窗口。如何保证一个类只有一个实例并且这个实例易于被访问呢,定义一个统一的全局变量可以确保对象随时可以被访问,但不能防止创建多个对象。一个最好的办法就是让类自身负责创建和保存它的唯一实例,并保证不创建其他实例,它还提供了一个访问该实例的方法,这就是单例模式的动机。

单例模式适用场景 单例模式优缺点 优点:

提供了对唯一实例的受控访问。在系统内存中只存在一个对象,因此可以节约系统的资源,对于一些需要频繁创建和销毁的对象,使用单例模式无疑是提高了系统的性能。单例模式允许可变数目的实例。基于单例模式可以进行扩展,使用与控制单例对象相似的方法获得指定个数的实例对象,既节约了系统资源,又解决了由于单例对象共享过多有损性能的问题(自行提供指定数目实例对象的类可成为多例类)

缺点:

由于单例模式没有抽象层,所以扩展起来很难。单例类职责过重,在一定程度上违背了单一职责。因为单例类既提供了业务方法,又提供了创建对象的方法(工厂方法),将对象的创建和对象本身的功能耦合在一起。垃圾回收机制,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源。在下次利用时又将重新实例化,这将导致共享单例对象状态丢失。

实现思路

单例设计模式

1.构造方法私有化(防止外部直接new一个新对象)2.声明一个本类的对象(静态的),(保证对象只有一个)3.给外部提供一个静态方法获取对象实例

两种方法详解

代码大全:

public class Singleton { public static void main(String[] args) { // Singleton1 s = new Singleton1(); //构造方法私有化,不能直接new Singleton2 s = Singleton2.instance(); //利用静态方法创建对象 s.print(); //输出 测试方法 Singleton2 s1 = Singleton2.instance(); s1.print(); //输出 测试方法 System.out.println(s1==s); //返回true 说明一共只有一个对象,及单例设计模式!!! } } //饿汉式 class Singleton1{ private Singleton1(){} //构造方法私有化 static Singleton1 s = new Singleton1(); //声明一个本类的对象 ;饿汉式,太饿了,直接new对象 public static Singleton1 instance() { //给外部提供一个静态方法获取对象实例 return s; } public void print() { //测试方法 System.out.println("测试方法"); } } //懒汉式 //在多线程时 有一点小bug,下篇详解 class Singleton2{ private Singleton2(){} //构造方法私有化 static Singleton2 s; // 只是声明一下,没有创建对象 public static Singleton2 instance() { //给外部提供一个静态方法获取对象实例 if (s==null) { s = new Singleton2(); //什么时候用到这个方法,再创建对象,生命周期较短 } return s; } public void print() { //测试方法 System.out.println("测试方法"); } }
转载请注明原文地址: https://www.6miu.com/read-4968450.html

最新回复(0)