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

Posted Summer-夏天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式——单例设计模式相关的知识,希望对你有一定的参考价值。

我们一般在学习的第一个设计模式都是单例设计模式,因为单例设计模式广泛的应用在我们程序开发中。今天就和大家简单的聊一聊单例设计模式,因为在我们刚开始学习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






以上是关于Java设计模式——单例设计模式的主要内容,如果未能解决你的问题,请参考以下文章

单例模式

设计模式(Java语言)-单例模式

java设计模式之--单例模式

JAVA基础-常用的设计模式

Objective-C中的单例模式

java单例模式