1.什么是单例设计模式:
单例设计模式:单例设计模式也就是说一个类只能有一个对象。
大家都知道类的创建是需要通过构造函数来实现的。默认情况下会有个空的构造函数,大家可以new很多对象。如果我们要让一个类只能有一个对象,这就需要把构造函数私有化,这样的话外面就无法创建这个对象了。
但是又要有一个对象。所以需要我们在当前类中提供个静态方法来获取当前类的对象。
2.什么时候使用单例设计模式:
当您想控制实例数目,节省系统资源的时候。
3.单例模式的优缺点:
优点:在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例,避免对资源的多重占用
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
4.单例模式的实现:单例模式的实现有很多中,我们一个个来分析。
//第一种单例设计模式,只在单线程操作中是单例的。多线程失效
public class SingleObject {
private static SingleObject singleObject;
private SingleObject() {
}
public static SingleObject getInstance(){
if(singleObject== null){
singleObject = new SingleObject();
}
return singleObject;
}
}
第二种单例设计模式,多线程和单线程都是单例设计模式,这种实现唯一的坏处就是如果这个对象我们从来都不用的话,它已经是创建状态了。所以会消耗内存
public class SingleObject2 {
private static SingleObject2 singleObject = new SingleObject2();
private SingleObject2() {
}
public static SingleObject2 getInstance(){
return singleObject;
}
}
第三种单例设计模式是在第一种设计模式上修改的,使其在多线程中也是安全的单例,整个方法同步,在方法中使用synchronized关键字,效率不是很好。因为有可能方法中一些代码是不需要同步的。
public class SingleObject3 {
private static SingleObject3 singleObject;
private SingleObject3() {
}
public static synchronized SingleObject3 getInstance() {
if (singleObject == null) {
singleObject = new SingleObject3();
}
return singleObject;
}
}
第四种单例设计模式,我们通过synchronized(SingleObject4.class)来实现同步(常用)
public class SingleObject4 {
private static SingleObject4 singleObject;
private SingleObject4() {
}
public static synchronized SingleObject4 getInstance(){
//一些不需要同步的逻辑
//xxxxx
if(singleObject== null){
synchronized(SingleObject4.class){
if(singleObject== null){
singleObject = new SingleObject4();
}
}
}
return singleObject;
}
}
第五种单例设计模式:使用静态内部类
public class SingleObject5 {
private static SingleObject5 singleObject;
private SingleObject5() {
}
private static class InnerClass{
private static SingleObject5 singleObject5 = new SingleObject5();
}
public SingleObject5 getInstance(){
return InnerClass.singleObject5;
}
}