基于java的单例模型和⼯⼚模式
基于java的单例模型和⼯⼚模式
⼀、单例模型
(⼀)定义
单例模型:指⼀个类只有⼀个实例,且该类能⾃⾏创建这个实例的⼀种模式。基于java的单例模型和⼯⼚模式(⼆)实现⽅式
常见的实现⽅式有:懒汉模式、饥汉模式、双重校验锁、静态内部类、枚举等⽅式实现
注意:
1、单例类只能有⼀个实例。
2、单例类必须⾃⼰创建⾃⼰的唯⼀实例。
3、单例类必须给所有其他对象提供这⼀实例。
(三)优缺点
1.优点:
(1)在内存⾥只有⼀个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(⽐如管理学院⾸页页⾯缓存)。
2、避免对资源的多重占⽤(⽐如写⽂件操作)。
2.缺点
没有接⼝,不能继承,与单⼀职责原则冲突,⼀个类应该只关⼼内部逻辑,⽽不关⼼外⾯怎么样来实例化。(四)使⽤场景
(1)要求⽣产唯⼀序列号。
(2)WEB 中的计数器,不⽤每次刷新都在数据库⾥加⼀次,⽤单例先缓存起来。
(3)创建的⼀个对象需要消耗的资源过多,⽐如 I/O 与数据库的连接等。
(五)实现
单例模式的几种实现方式创建⼀个 SingleObject 类。SingleObject 类有它的私有构造函数和本⾝的⼀个静态实例。
SingleObject 类提供了⼀个静态⽅法,供外界获取它的静态实例。SingletonPatternDemo 类使⽤ SingleObject 类来获取 SingleObject 对象。
1.新建Java项⽬,在java项⽬下新建包,在该包下新建类
2.创建 SingleObject 类
package simple;
public class SingleObject {
/
/创建 SingleObject 的⼀个对象
private static SingleObject instance = new SingleObject();
//让构造函数为 private,这样该类就不会被实例化
private SingleObject(){}
//获取唯⼀可⽤的对象
public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
3.创建SingletonPatternDemo类, 从singleObject 类获取唯⼀的对象package simple;
public class SingletonPatternDemo {
public static void main(String[] args) {
//不合法的构造函数
//编译时错误:构造函数 SingleObject() 是不可见的
//SingleObject object = new SingleObject();
//获取唯⼀可⽤的对象
SingleObject object = Instance();
//显⽰消息
object.showMessage();
}
}
4.点击SingletonPatternDemo右键,run"SSingletonPatternDemo…"
5.结果
(六)单例模型的⼏种实现⽅式
1.懒汉式,线程不安全
(1)概述
名称功能
是否 Lazy 初始化是
是否多线程安全否
实现难度易
描述:这种⽅式是最基本的实现⽅式,这种实现最⼤的问题就是不⽀持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
这种⽅式 lazy loading 很明显,不要求线程安全,在多线程不能正常⼯作。
(2)实现⽅式
package simple;
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2.懒汉式,线程安全
(1)概述
名称功能
是否 Lazy 初始化是
是否多线程安全是
实现难度易
描述:这种⽅式具备很好的 lazy loading,能够在多线程中很好的⼯作,但是,效率很低,99% 情况下不需要同步。
(2)优缺点
优点:第⼀次调⽤才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
getInstance() 的性能对应⽤程序不是很关键(该⽅法使⽤不太频繁)。
(3)实例
1.新建Singleton类
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论