单例设计模式
单例:单实例,设计出的类只能有一个对象
本人综合自身所学,也借鉴了不少博客,最终整理出来了我理解的版本,希望对大家有所帮助.
懒汉式:以时间换空间–>有可能出现线程安全问题(if判断容易出错,可能被其他线程抢掉对象 )
饿汉式:以空间换时间–>一般用饿汉式,线程安全,(在类创建好一个静态对象提供给系统使用)
特点:
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。
通过使用设计模式可以让我们的代码复用性更高,可维护性更高,让你的代码写的更优雅.
注解:
懒汉式: 不占内存资源,但时间较长(存在线程安全问题)不需要创建对象,如果一直没有人使用的话,那就不会创建实例,节约内存空间。每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间
饿汉式: 占内存资源,但时间短(常用)当类装载的时候就会创建类实例,占内存资源,不管用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间
代码如下
饿汉式: 类加载直接创建对象
public class Singleton1 {
// 3 创建该类的私有类属性
//静态方法只能调用静态属性的,所以还要再加上static
private static Singleton1 s = new Singleton1();
// 1 私有构造方法
private Singleton1(){
}
// 2 对外提供可以获得对象的静态方法
public static Singleton1 getInstance(){
return s;
}
}
测试类:
Singleton2 s1 = Singleton2.getInstance();
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s1);
System.out.println(s2);
懒汉式:
public class Singleton2 {
// 声明该类类型的属性
private static Singleton2 s;
// 私有构造方法
private Singleton2(){
}
// 对外提供公共的获得该类对象的静态方法
public static Singleton2 getInstance(){
if(s==null){
s = new Singleton2();
return s;
}else{
return s;
}
}
}
问: 为什么用单例、多例:
之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
问:用单例和多例的标准只有一个:
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;
本人很菜,如有错误敬请指出。大家多多交流,大神们多多指点。祝大家生活愉快。