Java设计模式(单例模式)
概念 【Java设计模式(单例模式)】单例模式:1.某个类只能有一个实例。2.它必须自行创建这个实例。3.它必须自行向整个系统提供这个实例。
如何实现:构造函数私有化,防止外部对它实例化,类内部提供一个静态的工厂方法生成该唯一实例,且该方法是public的,提供一个自身的静态私有成员变量,用于存储生成的唯一实例。
单例模式由于构造函数是私有的,故该类不能被继承。
实例:饿汉式和懒汉式单例模式,懒汉式在多线程环境中要注意使用同步机制
实例
class EagerSingleton{
/*饿汉式,在类加载时就将自己实例化*/
private static final EagerSingleton eagerSingleton = new EagerSingleton();
private EagerSingleton() { }
public static EagerSingleton getInstance() {
return eagerSingleton;
}
}
class LazySingleton{
/*懒汉式,在类加载时不会被实例化,只在第一次被引用时将自己实例化*/
private static LazySingleton lazySingleton;
private LazySingleton() { }
/*synchronized*/ public static LazySingleton getInstance() {
if(lazySingleton == null) {
System.out.println("第一个");
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
public class TestT {
public static void main(String[] args) {
EagerSingleton e1 = EagerSingleton.getInstance();
EagerSingleton e2 = EagerSingleton.getInstance();
LazySingleton l1 = LazySingleton.getInstance();
LazySingleton l2 = LazySingleton.getInstance();
System.out.println(e1+"<>"+l1);
System.out.println(e2+"<>"+l2);
}
}
运行结果:
第一个
cn.my.test1.EagerSingleton@16b4a017<>cn.my.test1.LazySingleton@8807e25
cn.my.test1.EagerSingleton@16b4a017<>cn.my.test1.LazySingleton@8807e25
比较
名称 | 区别 |
---|---|
饿汉式 | 资源利用效率稍差(类加载时就将自己实例化) |
懒汉式 | 速度和反应时间稍好,但要处理好多线程环境的同步问题(假如有多个线程同时引用此类,可以会生产出多个不同的实例对象,这就不符合单例模式了,故可以用同步锁加以限制,即在静态方法前加个synchronized关键字,或其他方式) |
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- Java基础-高级特性-枚举实现状态机