关于java设计模式单例模式的一些思考

单例模式 通俗易见的解读 设置某个类只存在一个实例

当是看着项目里关于单例可能运用的场景

1
2
3
4
5
6
7
8
9
10
11
12
全局变量定义类
public class constant
{
public static local lo;
public void init()
{
lo=new local();
}
}
//该类再通过初始化类调用方法进行初始化
这样local这个对象就只实例过一次
而且在多线程的情况下静态属性也是共享的

这里思索一下 线程虽然不安全 但这类都是通过配置文件赋值不带set方法 属性都是固定好值的 不同于单例模式经典的懒汉或饿汉,这是直接主动去创建实例的。

在看看单例模式的老几样

懒汉模式 在使用实例时再创建类实例

1
2
3
4
5
6
7
8
9
10
11
12
13
public class LHanDanli {
//定义一个私有类变量来存放单例,私有的目的是指外部无法直接获取这个变量,而要使用提供的公共方法来获取
private static LHanDanli dl = null;
//定义私有构造器,表示只在类内部使用,亦指单例的实例只能在单例类内部创建
private LHanDanli(){}
//定义一个公共的公开的方法来返回该类的实例,由于是懒汉式,需要在第一次使用时生成实例,所以为了线程安全,使用synchronized关键字来确保只会生成单例
public static synchronized LHanDanli getInstance(){
if(dl == null){
dl = new LHanDanli();
}
return dl;
}
}

须加锁 synchronized 才能保证单例,但加锁会影响效率。

饿汉模式 饿p一个 直接特么加载类就创建实例

1
2
3
4
5
6
7
8
9
10
public class EHanDanli {
//此处定义类变量实例并直接实例化,在类加载的时候就完成了实例化并保存在类中
private static EHanDanli dl = new EHanDanli();
//定义无参构造器,用于单例实例
private EHanDanli(){}
//定义公开方法,返回已创建的单例
public static EHanDanli getInstance(){
return dl;
}
}

缺点明显重复内存 易产生垃圾对象。

这里还有

双检索/双重校验锁 dcl

登记式/静态内部类

不细去看了 详情 https://www.runoob.com/design-pattern/singleton-pattern.html

Effective Java 作者 Josh Bloch 提倡的方式 枚举

1
2
3
4
5
public enum Singleton {  
INSTANCE;
public void whateverMethod() {
}
}

有意思的时这玩意是根据序列化机制,绝对防止多次实例化。

说了单例模式的实现我不禁思考,我何时去使用?

Windows任务管理器我是知道的,永远只能存在一个,不信可以试试,也算是典型的单例模式实现了。

那在java开发中何时去使用?

根据唯一实例这一主要特性 我第一想到的就是那些存储全局变量的类,以及工具类和语言类

翻阅大量的资料 基本是应用于以下场景

有状态的工具类对象;

频繁访问数据库或文件的对象;

可得到改进方向 对于读取配置文件赋值的全局使用的类;

对于涉及io操作的工具类;

对于初始化数据连接池的类;

还有一点 非常有意思线程池就是用单例进行设计的。

关于单例模式 现在先这样。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!