
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:单例类只能有一个实例。
通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。
单例模式结构单例模式的主要结构如下:
单例类:包含一个实例且能自行创建这个实例的类。
访问类:使用单例的类。
懒汉式单例模式:该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。
如果编写的是多线程程序,则不需要关键字 volatile 和 synchronized,否则将存在线程非安全的问题。如果有这两个关键字就能保证线程安全,但是每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。
public class Singleton {
// 先声明,不创建实例
private static Singleton singleton;
// 使用private关键字避免在外部实例化
private Singleton(){}
public static Singleton getInstance(){
// 需要时再创建实例
if(singleton == null)
singleton = new Singleton();
return singleton;
}
}
饿汉式单例模式:该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。
饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题。
public class Singleton {
// 直接创建,不再需要时再创建实例
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}