Java设计模式——单例设计模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012721519/article/details/80395558

我们一般在学习的第一个设计模式都是单例设计模式,因为单例设计模式广泛的应用在我们程序开发中。今天就和大家简单的聊一聊单例设计模式,因为在我们刚开始学习Java基础时,就了解了单例,有的同学在学习时非常困惑,不明白什么是单例,不明白在什么场景下会用到单例设计模式。

我们先说一下单例的概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

通过概念我们可以简单的知道,所谓的单例模式就是保证我们定义的类在我们的程序中只能new出一个对像(实例)。在一些特定情况下,我们只允许类只能实例化一次,这种情况下我们就需要用到了单例设计模式。

说了这么多,我们写一个初级的单例给大家展示一下:

Class Single
{
private static Single instance;
Private Singleton(){}
Public static Single getInstance(){
If(instance == null){
Instance = new Single();
}
Return instance;
}
}

大家可以看到,我们是如何保证这个类只能被实例化一次的,首先1、我们对它的构造函数进行私有化,确保外部的类不能对他进行实例化。2、提供一个静态方法来获取当前类对象。

如果外部类想访问这个类对象,我们可以通过类名.getInstance()的方法来获取Single的类对象。

单例设计模式又分为两种,饱汉式和饿汉式。

饱汉式:

  
/** 
 * 饱汉式(懒汉式)----就是有钱,豪,用的时候再new(线程不安全) 
  */ 
public class Single1 {  
    //这个就不能加final,因为要在其他地方给他再次赋值呢。  
    //加了final,那就默认一直是null啦,而且还不能再次给此属性赋值。  
//此属性是静态,那么就是共享数据,多线程并发操作共享数据是有可能的。那么就会出现下面的线程不安全现象。  
Priavte Single1
    private static Single1 SingleInstance;  
   
    private Singlet1() {  
    }  
   
    public static Single1 getSingleInstance() {  
        if (SingleInstance == null) {  
            //在这个地方,多线程的时候,  
            //可能A线程挂起,此属性还是null,那么B线程可能也判断条件OK也进来啦。  
            //然后A线程可以执行的时候就会new个对象,线程B也会new个对象。  
            //就不能保证内存的唯一性。也就是线程不安全  
            SingleInstance = new Single1();  
        }  
        return SingleInstance;  
}

饿汉式:

public class Single2 {  
    //有的会加final修饰符(更为严谨),添加final修饰符之后,指向的引用不能再做更改。  
    //这是final的用法:final成员变量表示常量,只能被赋值一次,赋值后值不能再改变。  
    //这句话得这么理解:  
    //对于一个final变量。  
    // 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;  
    // 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。  
    private static final Single2 SingleInstance = new Single2();  
   
    private Single2() {  
    }  
   
    public static Single2 getSingleInstance() {  
        return SingleInstance;  
    }  
}





Good luck!

Write by Jimmy.li






猜你喜欢

转载自blog.csdn.net/u012721519/article/details/80395558