免费申请一个qq号/seo入门基础知识
介绍:
确保某个类只有一个实例,而且自行实例化,并向整个系统提供这个实例
单例模式的三个要点:
- 某个类只能有一个实例
- 必须自行创建这个实例
- 必须自行向整个系统提供这个实例
包含角色:
单例模式只包含一个单例角色.
创建过程注意点:
- 提供一个自身私有的静态成员变量
- 单例类的构造函数为私有
- 提供一个公有的静态工厂方法
分类:
- 懒汉模式
- 饿汉模式
图:
代码:
//懒汉模式
public class LazySingletons {private static LazySingletons lazySingletons = null;private LazySingletons() {}//synchronized 用来处理多线程,不加也可以synchronized public static LazySingletons getInstance(){if(lazySingletons == null){lazySingletons = new LazySingletons();}return lazySingletons;}}
//饿汉模式
public class EagerSingleton {private static EagerSingleton instance = new EagerSingleton();private EagerSingleton(){}public static EagerSingleton getInstance(){return instance;}}
区别:
饿汉式是自己加载时自己实例化,单从资源利用角度来讲,这个比懒汉式资源要差一些,从速度和反应时间来讲,这个比懒汉式好一些
懒汉式是实现静态工厂方法是使用了同步化机制,以处理多线程环境.
优点:
- 提供了唯一实例受控访问
- 提高系统性能
缺点:
- 没有抽象层,拓展很困难
- 自责过重,在一定程度上违背了"单一职责"
- 滥用容易引发一些其他问题,比如当单例模式作为资源控制器的时候,由于长时间的不调用,java自带垃圾回收机制会将它回收,这个时候容易状态就会丢失.
案例:
在操作系统中,打印池是一个用于管理打印任务的应用程序,通过打印池用户可以删除,终止或者改变打印任务的优先级,在系统中只允许运行一个打印池对象,如果重复创建,打印池就抛出异常
分析图:
代码:
异常类:
public class PrintSpoolerException extends Exception{public PrintSpoolerException(String message){super(message);}
}
打印池:
public class PrintSpoolerSingleton {private static PrintSpoolerSingleton instance = null;private PrintSpoolerSingleton() {}public static PrintSpoolerSingleton getInstance() throws PrintSpoolerException {if (instance == null) {System.out.println("创建打印池");instance = new PrintSpoolerSingleton();} else {throw new PrintSpoolerException("打印池正在工作...");}return instance;}public void managerJobs() throws InterruptedException {System.out.println("管理打印任务");Thread.sleep(1000);System.gc();}}
测试:
public class PrintSpoolerSingletonTest {public static void main(String[] args) {PrintSpoolerSingleton ps1,ps2;try {ps1 = PrintSpoolerSingleton.getInstance();ps1.managerJobs();} catch (Exception e) {System.out.println(e.getMessage());}System.out.println("-----------------------------");try {ps2 = PrintSpoolerSingleton.getInstance();ps2.managerJobs();} catch (Exception e) {System.out.println(e.getMessage());}}
}
结果: