设计模式
是软件开发人员在软件开发过程中面临的一般问题的解决方案
单例模式
目的:使得类的一个对象成为该类系统中的唯一实例
定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供
因此,设计要点是:
-
某个类只能有一个实例
-
必须自行创建实例
-
必须自行向整个系统提供这个实例
实现:
-
只提供私有的构造方法
-
含有一个该类的静态私有对象
-
提供一个静态的公有方法用于创建、获取静态私有对象
代码实现方案:
-
饿汉式
-
懒汉式
饿汉式
类加载时,静态实例对象完成了实例化操作;空间换时间。(对象创建过程中实例化)
饿汉式线程安全
新建文件SingletonOne.java
/**
* 饿汉式
*/
public class SingletonOne {
//1.创建类中的私有构造函数
private SingletonOne(){
}
//2.创建该类型的私有静态实例
private static SingletonOne instance = new SingletonOne();
//3.创建公有静态方法返回静态实例对象
public static SingletonOne getInstance(){
return instance;
}
}
新建文件Test.java
public class Test {
public static void main(String[] args) {
SingletonOne one = SingletonOne.getInstance();
SingletonOne two = SingletonOne.getInstance();
System.out.println(one);
System.out.println(two);
}
}
输出结果可以看到是同一个类的地址。
懒汉式
类加载时并未实例化,第一次使用时才进行实例化;时间换空间。(静态公有方法中实例化)
懒汉式存在线程风险
懒汉式线程安全的解决方案:(此处大致介绍下,后边在线程篇会详细介绍)
-
同步锁
-
双重校验锁
-
静态内部类
-
枚举
新建文件:SingletonOne.java
public class SingletonTwo {
//1.创建私有构造方法
private SingletonTwo(){
}
//2.创建静态的该类实例对象
private static SingletonTwo instance = null;
//3.创建开放的静态方法提供实例对象
public static SingletonTwo getInstance(){
if(instance == null)
instance = new SingletonTwo();
return instance;
}
}
新建文件Test.java
public class Test {
public static void main(String[] args) {
SingletonTwo one = SingletonTwo.getInstance();
SingletonTwo two = SingletonTwo.getInstance();
System.out.println(one);
System.out.println(two);
}
}
输出结果同上饿汉式代码
单列模式的特点以及应用场景
优点:
-
在内存中只有一个对象,节省内存
-
避免频繁的创建和销毁对象,提高性能
-
避免对共享资源的多重占用
缺点:
-
扩展比较困难
-
如果实例化后的对象长期不利用,系统将默认认为垃圾,进行回收,造成对象状态丢失
使用场景:
-
创建对象时占用资源过多,但同时又需要用到该类对象
-
对系统内资源要求统一读写,如读写配置信息
-
当多个实例存在可能引起程序逻辑错误,如号码生成器
网友评论