什么是单例模式?单例模式有什么作⽤?为什么要⽤单例模式单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之⼀。这种类型的设计模式属于创建型模式,它提供了⼀种创建对象的最佳⽅式。
这种模式涉及到⼀个单⼀的类,该类负责创建⾃⼰的对象,同时确保只有单个对象被创建。这个类提供了⼀种访问其唯⼀的对象的⽅式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有⼀个实例。
2、单例类必须⾃⼰创建⾃⼰的唯⼀实例。
3、单例类必须给所有其他对象提供这⼀实例。
介绍
意图:保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点。
主要解决:⼀个全局使⽤的类频繁地创建与销毁。
何时使⽤:当您想控制实例数⽬,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应⽤实例: 1、⼀个党只能有⼀个书记。 2、Windows 是多进程多线程的,在操作⼀个⽂件的时候,就不可避免地出现多个进程或线程同时操作⼀个⽂件的现象,所以所有⽂件的处理必须通过唯⼀的实例来进⾏。 3、⼀些设备管理器常常设计为单例模式,⽐如⼀个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同⼀个⽂件。
优点: 1、在内存⾥只有⼀个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(⽐如管理学院⾸页页⾯缓存)。 2、避免对资源的多重占⽤(⽐如写⽂件操作)。
缺点:没有接⼝,不能继承,与单⼀职责原则冲突,⼀个类应该只关⼼内部逻辑,⽽不关⼼外⾯怎么样来实例化。
使⽤场景: 1、要求⽣产唯⼀序列号。 2、WEB 中的计数器,不⽤每次刷新都在数据库⾥加⼀次,⽤单例先缓存起来。 3、创建的⼀个对象需要消耗的资源过多,⽐如 I/O 与数据库的连接等。
注意事项:getInstance() ⽅法中需要使⽤同步锁 synchronized (Singleton.class) 防⽌多线程同时进⼊造成 instance 被多次实例化。为什么要⽤单例模式?
public class Printer {
private static Printer printer =null;//创建⼀个私有的全局变量
/*
* 如果有多线程并发访问时,上锁,让其排队等候,⼀次只能⼀⼈⽤。
*/
public static synchronized Printer getPrinter(){
if(printer==null){//如果为空,创建本实例
printer = new Printer();
}
return printer;
}
单例模式的几种实现方式
/*
* 构造私有化,保证在系统的使⽤中,只有⼀个实例
*/
private Printer(){
}
}
从代码上来分析,单例模式,⾸先向外提供了⼀个可被访问的实例化的对象,如果没有此对象时,该printer类创建⼀个。如果遇到多线程并发访问,加上关键字Synchronized,上锁让没有持有该对象的类处于等待状态。当前持有该printer的线程任务结束之后,处于等待中的线程才能逐个去持有该实例,去操作其⽅法。这样的⼀个过程 在编程中被称为单例模式。
如果在系统中不使⽤单例模式的话,在碰到多线程访问的时候,printer就会给要请求的类,分别在内
存中new出⼀个printer对象,让这些请求的类去做print⽅法。这样⼤量占有内存,就会导致系统运⾏变慢,像电脑的CPU⼀样,占有量极⾼,电脑卡死不动的感觉。因为系统的硬件设施需求变动量⼩,所以只能想出⼀个节约成本 的⽅法就是,单例模式,让多线程处于等待的状态,⼀个 ⼀个的去解决,这样,即节约内存,提交了运⾏的成本。也就是单例存在的意义。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。