qq群:811317840 欢迎大家
关于设计模式的学习,现在刚开始,记录在册,互相交流,有什么不对的大家可以留言。
单例模式:通俗的理解为这个类只存在一个实例,常常扮演系统的全局对象,就像计算机只有一个任务管理器。那么我们在开发中有哪些使用了单例模式呢?如数据库连接池等。
单例模式区分饿汉式和懒汉式:
饿汉式:
public class SingletonHunger {
//私有构造 使用private 限制这个类不能通过new获得
private SingletonHunger () {
}
//私有,防止被引用,类加载的时候就会创建
private static SingletonHunger instance = new SingletonHunger();
//提供公共静态方法获取
public static SingletonHunger getInstance() {
System.out.println("饿汉");
return instance;
}
}
懒汉式:来自大话设计模式一书
public class Singleton {
//私有无参构造,防止被实例化
private Singleton() {
}
//私有静态实例,防止被引用,此处赋值为null,实现延迟加载
private static Singleton instance = null;
//程序运行时创建一个静态只读的进程辅助对象
private static final Object obj = new Object();
//静态方法,用于创建实例
public static Singleton getInstance () {
System.out.println("懒汉");
if (instance == null) {
synchronized(obj) {//加锁 防止并发产生多个实例
if (instance == null) {//此处必须要判断 也是为了防止并发时产生多个实例
instance = new Singleton();
}
}
}
return instance;
}
}
自己基础不好,看了饿加载,我还是不太明白,
private static SingletonHunger instance = new SingletonHunger();
这一句代码是在什么时候执行的。不懂就百度。
-
静态成员变量在程序编译时加载,属于类变量,被类的对象共享,在这个类不运行,或者没用了,由垃圾回收机制销毁,我们可以不管它。
-
实例变量在类实例化对象时候创建,也就是在调用构造函数是产生的,当这个对象无效时或不在用的时候由垃圾回收机制自动销毁。
-
局部变量在局部范围使用时创建,当局部变量在局部方法没有时,由垃圾回收机制自动销毁。
通过第一点就可以明白,静态成员变量在类编译时就创建了,意思是我们通过(类名.方法名)获取时,就已经存在了,并且这个类只有一个静态成员变量,无论你用不用,都已经创建了实例。
而懒汉式代码中,静态成员变量初始是赋值为null,所以类加载时并没有创建,在我们手动执行(类名.方法名)时才创建实例,故而称之为懒汉式