美文网首页JavaJava 杂谈Java设计模式
面向对象编程设计模式------单例模式

面向对象编程设计模式------单例模式

作者: 从菜鸟到老菜鸟 | 来源:发表于2019-04-30 17:12 被阅读3次

单例模式

  Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
  1、私有化类的构造函数,防止类外部的代码创建该类的实例。
  所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法机会失效。
  2、有一个可以获取该类实例的公共方法,该方法要是静态的。
  单例模式也有常见的两种模式:

饿汉式单例

/**
 * @Description: 单例模式,饿汉式
 * @author: zxt
 * @time: 2018年3月13日 下午3:31:29
 */
public class Singleton2 {
    // 本类类型的私有成员变量,在初始化时即创建类的实例,会提前占用系统资源,不过更加安全
    private static Singleton2 instance = new Singleton2();

    // 构造方法,设计成私有的,防止外部代码的访问,只允许内部构造
    private Singleton2() {
        // 构造逻辑
    }

    // 提供了一个供外部访问本class的静态方法,返回本类的一个实例
    public static Singleton2 getInstance() {
        return instance;
    }
}

  这种方式静态初始化自己的唯一实例,需要提前占用系统资源,但是多线程访问时较安全。

懒汉式单例

/**
 * @Description: 单例模式,懒汉式
 * @author: zxt
 * @time: 2018年3月13日 下午3:13:51
 */
public class Singleton {
    // 本类类型的私有成员变量
    private static Singleton instance;

    // 构造方法,设计成私有的,防止外部代码的访问,只允许内部构造
    private Singleton() {
        // 构造逻辑
    }

    // 提供了一个供外部访问本class的静态方法,返回本类的一个实例
    //由于本类的构造方法私有化,外部无法调用,所以访问接口必须设计成静态的,通过类名即可访问
    public static Singleton getInstance() {
        // 在第一次使用时才生成实例称为懒汉式单例,效率更好,但是存在多线程访问不安全的问题
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    // 多线程同时访问时,可能会创建多个实例,此时需要使用锁来保证实例唯一
    public synchronized static Singleton getInstance2() {
        // 对方法进行同步,会影响性能,所以需要考虑同步代码块,来改良
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    // 双重锁定
    public static Singleton getInstance3() {
        if (instance == null) {
            
            synchronized (Singleton.class) {
                // 二次检查保证同时判断instance为空的进程只有一个进入同步代码区
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

  懒汉式单例是在类实例第一次访问的时候创建,这样效率更高,但是当多线程同时访问时,可能造成创建多个实例。所以需要使用锁,设置临界区代码,当有一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直至该对象被释放。
  其他实现单例的方法还有:静态内置类,static代码块,枚举等。

相关文章

  • 面向对象编程设计模式------单例模式

    单例模式   Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 让类自...

  • 单例模式

    面向对象设计的设计模式(四):单例模式

  • 单例模式

    1. 单例模式 在面向对象的程序设计中, 单例模式是最简单的设计模式,这种类型的设计模式属于创建型模型,所谓单例....

  • Singleton 单例模式

    搬运自大神博客单例模式(Singleton)及其C++实现 单例模式,在GOF的《设计模式:可复用面向对象软件的基...

  • 单例模式

    这几天在看PHP面向对象,设计模式与实现这本书。谈谈对单例模式的理解。 单例模式:在系统中需要一个对象来存储数据,...

  • 单例模式

    一、单例模式介绍 单例模式简而言之就是只有一个实例化对象的类,初学者可以通过单例 模式的设计更好的理解面向...

  • js 面向对象编程 - 单例模式

    // 面向对象编程(Object Oriented Programming) /* * 单例设计模式(Single...

  • 设计模式

    《C#设计模式》 《C#设计模式》-设计模式概述 《C#设计模式》-面向对象设计原则 《C#设计模式》-单例模式 ...

  • ES6快速入门(三)

    1. 面向对象 a) 单例模式(单体模式) b) 工厂模式 es5的面向对象工厂模式: 首先让我们一起来回一下es...

  • 008-面向对象(模式)& 异常

    工厂模式(面向对象封装练习) 概念 用法 非工厂模式: 工厂模式: new方法(单例模式就会用到重写new方法) ...

网友评论

    本文标题:面向对象编程设计模式------单例模式

    本文链接:https://www.haomeiwen.com/subject/uawvnqtx.html