单例模式
定义 (确保一个类只有一个实例 而且自行实例化并向整个系统提供这个实例)
确保一个类中只有一个实例 那么他的构造函数需要时private权限的 并且是在自己的类中自行实例化 (自己new出来的 )
uml类图
单例模式的要点有三个;
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
单例模式的优点
1 由于单例模式在整个项目运行中只有一个实例 这样就减少了内存的占用 当一个对象需要频繁的创建 销毁时 创建和销毁的过程又没有办法优化 这个时候单例模式的优势非常明显
2 减少了性能的开销 当一个对像的创建需要 比较多的资源 比如读取配置 产生其他的依赖对象的时候 都可以在系统启动的时候创建一个单例对象 在内存中保存
3 避免对资源的多重占用 单例只有一个对象 比如文件资源的读写操作 由于只有一个对像 避免了对一个文件的同时操作
4 可以设置全局访问 共享资源访问 比如登录的用户
单例模式的缺点
不利于扩展 单例模式没有接口 扩展很难 有需求的变更的时候只能修改代码
代码示例 单列模式
/**
* 第一种(懒汉,线程不安全)
*/
public class WangTeacher {
private static WangTeacher instance;
private WangTeacher () {}
public static WangTeacher getInstance() {
if (instance == null) {
instance = new WangTeacher();
}
return instance;
}
public static void say() {
System.out.println("我是王老师");
}
}
/**
* 第二种(懒汉,线程安全,但是很消耗性能)
*/
public class QiTeacher {
private static QiTeacher instance;
private QiTeacher () {}
public static synchronized QiTeacher getInstance() {
if (instance == null) {
instance = new QiTeacher();
}
return instance;
}
public static void say() {
System.out.println("我是齐老师");
}
}
/**
* 第五种(静态内部类)
*/
public class SunTeacher {
private static class SingletonHolder {
private static final SunTeacher INSTANCE = new SunTeacher();
}
private SunTeacher (){}
public static final SunTeacher getInstance() {
return SingletonHolder.INSTANCE;
}
}
/**
* 双重锁
*/
public class ZhangTeacher {
private volatile static ZhangTeacher singleton;
private ZhangTeacher (){}
public static ZhangTeacher getSingleton() {
if (singleton == null) {
synchronized (ZhangTeacher.class) {
if (singleton == null) {
singleton = new ZhangTeacher();
}
}
}
return singleton;
}
}
联系客服