Java|深入研究Java单例设计模式

简介: Java|深入研究Java单例设计模式

简介

看到标题可能有人会问什么是单例模式呢?

在程序设计过程中,会遇到这么一个问题:当设计好一个类之后,会发现可以在别的类中调用类的构造方法实例化一个对象。并且通过实例化对象调用类中的属性和方法。

那么问题来了,如果存在某个类,这个类对于程序来说只需要产生一个类的时候,并且需要强制要求此类只能产生一个对象应该怎么办?这个时候就可以用到单例设计模式。所谓单例设计就是构造方法私有化,在类中实例化对象,通过类的静态方法调用类中的属性和方法。

其中单例设计又分为两种:

1.饿汉式:在系统加载类的时候就会自动提供实例对象。

2.懒汉式:在第一次使用的时候进行实例处理。


饿汉式

饿汉式单例设计模式就是在系统加载类的时候就会自动提供实例对象

那么如何才能实现饿汉式单例设计呢?可以将对象设置成一个静态的属性,再通过一个静态方法来获得这个属性。因为同一个类中静态属性只能静态访问。

下面来看看具体例子:

public  class Singleton {

    private static final Singleton SINGLETON  = new Singleton();

private Singleton() {

System.out.println("饿汉式单例设计构造方法");

 

    }

    public static Singleton getSingloten(){

        return SINGLETON;

    }

    public void print(){

        System.out.println("饿汉式单例设计");

    }

}

这就是一个单例设计的例子。在类中静态实例化了一个对象,并且有一个静态方法可以获得此对象。当需要用到此类时,直接通过类名就可以调用静态方法得到对象。


懒汉式

懒汉式单例设计是在第一次使用的时候进行实例处理。和饿汉式设计的区别就在于懒汉式设计是在调用静态方法的时候才会产生实例化对象,而不是系统直接提供。下面来看看具体事例:

通过这种单例设计我们就能达到只能得到一个对象的目的,但是这种懒汉式单例设计还是存在一个问题。是什么呢?来看看这个例子。

当使用多线程的时候调用静态方法获得对象的时候,运行结果说明并不是只产生一个对象,而是产生了三个对象。

运行结果如下图所示:

通过分析发现,在多线程中访问静态方法时,线程是同时访问的,并且同时判断对象是否为空。三个线程同时得到对象为空的结果,所以产生了三个对象。那么怎么去解决呢?可以通过线程的同步操作来实现这个操作。

实现方法如下:

同步操作就是当有一个线程在操作的时候,其他的线程就等待,这样就避免了线程同时获得对象为空的结果。但是这样加同步操作好像也不太合适,因为需要做的就只是同步操作判断对象是否为空的部分,所以将整个方法设为同步操作有点过于草率。因此还可以这样优化一下:

public  static Singleton getSingloten(){

        if (SINGLETON == null){

            synchronized (Singleton.class) {

                if (SINGLETON == null) {

                    SINGLETON = new  Singleton();

                }

            }

        }

        return SINGLETON;

    }

来看看运行结果:

构造方法确实是只被调用了一次,这样也达到了单例设计只产生一个对象的目的。有了这样的设计,单例设计才算是完美。


目录
相关文章
|
1天前
|
存储 Java
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
|
2天前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
7 1
|
2天前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
7 1
|
2天前
|
设计模式 Java
Java一分钟之-设计模式:观察者模式与事件驱动
【5月更文挑战第17天】本文探讨了Java中实现组件间通信的观察者模式和事件驱动编程。观察者模式提供订阅机制,当对象状态改变时通知所有依赖对象。然而,它可能引发性能问题、循环依赖和内存泄漏。代码示例展示了如何实现和避免这些问题。事件驱动编程则响应用户输入和系统事件,但回调地狱和同步/异步混淆可能造成困扰。JavaFX事件驱动示例解释了如何处理事件。理解这两种模式有助于编写健壮的程序。
6 1
|
2天前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
11 2
|
2天前
|
设计模式 SQL 安全
Java一分钟之-设计模式:单例模式的实现
【5月更文挑战第16天】本文介绍了单例模式的四种实现方式:饿汉式(静态初始化)、懒汉式(双检锁)、静态内部类和枚举单例,以及相关问题和解决方法。关注线程安全、反射攻击、序列化、生命周期和测试性,选择合适的实现方式以确保代码质量。了解单例模式的优缺点,谨慎使用,提升设计效率。
18 3
|
3天前
|
设计模式 Java
【JAVA基础篇教学】第十四篇:Java中设计模式
【JAVA基础篇教学】第十四篇:Java中设计模式
|
3天前
|
设计模式 算法 Java
设计模式在Java开发中的应用
设计模式在Java开发中的应用
18 0
|
3天前
|
安全 IDE Java
Java串口通信技术探究2:RXTX库单例测试及应用
Java串口通信技术探究2:RXTX库单例测试及应用
29 4
|
3天前
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
24 4