天天看点

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

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

                                        ——Javee

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

简单理解就是:对于特定问题的特定解决方案。

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

在某些特定的系统中,对于某些特定的类只需要一个创建的对象,这就是单例模式。

我们身边有哪些单例模式的实例呢?比如说,在学校中,学生和教师可以有多个,但是校长却只能有一个;在公司里,员工可以有多个,但老板却只能有一个。所以,在设计的过程中,校长类和老板类有且只能有一个实例化对象,这就是生活中最常见的单例模式。

单例模式的特点:

  • 一个类只有一个对象
  • 类内部声明一个本类静态的对象
  • 类只对外提供一个可以获取此对象的静态公共方法
  • 不能在类外创建对象

那么,单例模式是怎么实现的呢?在讲单例模式的实现之前,我们先回忆一下,通常情况下,我们创建一个对象是怎么创建的。通常情况下,我们会通过new关键字和类对外提供的构造函数或者默认的构造函数来创建一个类的对象。

在单例模式中,为了确保不能在类的外面随意创建对象,会把类的构造函数设为私有private,然后在类的里面创建一个私有的静态对象,然后通过public静态方法把这个对象提供给程序员使用。

单例模式在对象创建的时间上的不同由分为懒汉式和饿汉式:

文字描述起来比较抽象,我们先看代码:

饿汉式代码实现:

//饿汉式
package cn.edu.ncu.online;

/**
 * @Author Javee
 * @Date 2019/8/12 20:00
 * @Description
 */
public class Principal {
    //类的私有属性
    private String name;
    private int age;

    //私有化构造方法
    private Principal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //创建本类的私有静态对象作为属性
    private static Principal principal = new Principal("王校长", 30);

    //对外提供一个可以获取此对象的静态公共方法
    public static Principal getPrincipal(){
        return principal;
    }
}
           

懒汉式代码实现:

//懒汉式
package cn.edu.ncu.online;

/**
 * @Author Javee
 * @Date 2019/8/12 20:06
 * @Description
 */
public class Boss {
    //类的私有属性
    private String name;
    private int age;

    //私有化构造方法
    private Boss(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //创建本类的私有静态对象作为属性
    private static Boss boss;

    //对外提供一个可以获取此对象的静态公共方法
    public static Boss getBoss(){
        if(boss == null) {
            boss = new Boss("王校长", 30);
        }
        return boss;
    }
}
           

我们仔细对比一下这两段代码,唯一的区别就是初始化对象的时间不同。故名思意,比如我是一个乞讨者,声明对象就是你给了我钱,而初始化对象就是我用钱买了馒头。饿汉式就是,我太饿了,你给了我钱我立马就买了馒头来吃,所以在声明对象时就初始化了对象。懒汉式就是,我比较懒,你给了我钱,但我现在懒得买,等到饿的受不了的时候再去买馒头,所以刚开始只是声明对象,在用这个对象的时候再去初始化它。

虽然懒汉式和饿汉式初始化有所区别,但是在使用方面没有区别。但是在第一次获取对象之前,懒汉式因为还没有初始化对象,所以比饿汉式节省空间。多线程操作时,懒汉式存在线程安全问题,饿汉式没有线程安全问题。