单例设计模式:
什么是单例?
如果一个类 只能 创建一个对象,那么这个类叫做单例类。这个对象就是
一个单例对象。
一个类只能创建一个对象,到底有什么用呢?创建类的目的不就是想要创建
对象吗?
在程序很简单的时候,单例没有什么用。但是当程序变得复杂的时候,
你可能需要在不同的类,不同的对象之间传递内容。这个时候单例就非常
重要了。
我们可以把需要传递的内容放到一个统一的地方。需要存数据的时候,
把数据放到我们统一规定的地方,需要取数据的时候,去规定的地方去取。
如何保证一个类只有一个实例对象呢?
想要保证一个类只有一个对象,
那第一件事就是禁用new。
第一我们不提供自定义的构造方法
第二我们把系统默认生成的无参构造方法私有化(private)
禁用new,你发现,你无法创建对象。你解决创建多个对象的问题。你现在
一个对象都创建不了了。现在是0个对象。
第二件事,我们提供一个 类方法(static) 来获取本类的对象。
public static Singleton getInstance(){}
第三件事,保证只new一次。
如何保证?加判断条件。
需要创建一个私有静态属性 private static Singleton s = null
在getInstance方法内做判断
if(s == null){
s = new Singleton();
}
上述代码确实保证了对象有且只有一个,但是在多线程下是不安全的。
需要加锁(synchronized块、synchronized方法、lock)
上面整个完整的单例创建过程既保证了单线程下对象唯一也保证了多线程下
对象唯一。
上面的模式称为单例的 ------单例的懒汉模式。(懒加载,延迟加载,用到的
时候才加载)。
public class Singleton {
private static Singleton s = null;
private String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
private Singleton(){
}
public synchronized static Singleton getInstance() {
if(s == null) {
s = new Singleton();
}
return s;
}
饿汉模式的单例
public class Singleton2 {
private static Singleton2 s = new Singleton2();
public static Singleton2 getInstance(){
return s;
}
private Singleton2() {
}
}