单例模式:一个类确保自己只有单个对象被创建。它属于创建型模式。
注意点:
1>单例类只能有一个实例
2>单例类必须是自己创建自己唯一的实例
3>单例类必须给其它所有对象提供这个实例
设计意图:保证一个类仅有一个实例,并提供一个访问它的全局权限
何时使用:有些场景只能由某个实例完成
应用实例:
1>一个国家只能有一个主席
2>Windows是多进程的,在操作一个文件的时候,如果多个进程同时操作一个文件的时候会出现死锁的现象,因此需要产生一个唯一的实例来操作文件
应用场景:
1>全局变量
2>管理打印机
实现
1.创建单例类
//SingleObject.java
public class SingleObject {
// 创建类的唯一对象
private static SingleObject instance = new SingleObject();
// 设置该类的构造函数类型为private,这样该类不会被实例化
private SingleObject() {
}
// 获取唯一可用的对象
public static SingleObject getInstance() {
return instance;
}
/*** 该类的属性与方法 **/
public void showMessage() {
System.out.println("HelloWorld");
}
}
2.使用单例类
public class SingleDemo {
public static void main(String[] args) {
//调用单例对象
SingleObject object = SingleObject.getInstance();
//获取单例对象的属性、方法等
object.showMessage();
}
}
3.输出结果
HelloWorld
4.单例模式的几种实现方式
大致分为 懒汉式 与 饿汉式
懒汉式:只有调用getInstance方法的时候才创建单例类的实例。 所以线程是不安全的。 饿汉子:该单例类一旦被加载,就将该类实例化,保证使用该实例的时候,该实例已经存在了。很明显,饿汉子的线程是安全的。
饿汉式创建单例代码如下
public class SingleObject {
// 创建类的唯一对象
private static SingleObject instance = new SingleObject();
// 设置该类的构造函数类型为private,这样该类不会被实例化
private SingleObject() {
}
// 获取唯一可用的对象
public static SingleObject getInstance() {
return instance;
}
/*** 该类的属性与方法 **/
public void showMessage() {
System.out.println("HelloWorld");
}
}
懒汉式代码如下
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}