设计模式一:单例模式
单例模式有很多变种,由于本人能力,就总结5种,和其它的一些变种
1、为什么要使用单例模式
之所以使用单例模式,是因为只需要一个实例,那为什么说,只需要一个实例呢,打个比方,你用jdbc数据库的时候,是不是只要一个数据库连接就可以了,它的地位就是一个,一个就够了、多了反而会存在浪费资源,线程不安全等等问题。在android中MyApplication类就可以使用单例,来实现,因为它就用一次,只要一个实例,这个时候,就自然出现单例的概念。
单例1: 饿汉式单例
为什么叫饿汉呢,很简单,是由下面可以看到,在类的成员变量中,就只有自己的实例,什么意思?就是说,类一旦加载创建,它的实例就创建出来了,这样,其它对象,就直接可以使用它的getInstance方法,直接返回一个单例,它是唯一!请记住
public class Singleton {
//成员变量,在类一加载时,就被创建,为getInstance服务
private static Singleton instance = new Singleton();
private Singleton() {
//这个是私有的构造方法,只能在自己的类里,使用new ,别类是不可以使用A a = new A();
}
//对别类提供一个外接口,别类,可以直接使用来返回一个实例
public static Singleton getInstance() {
return instance;
}
}
单例2:懒汉单例模式
为什么叫懒汉式呢,刚刚在上例中,是在成员变量中,类加载时就成功有了实例,后来的getInstance,对外的类,就可得到实例,现在我们的懒汉式,就是懒!一开始加载时,懒得创建,在getInstance方法中,才创建,是懒汉,才拖到最后
public class Singleton {
//看到没有,只是声明,所有加载类时,没有创建实例
private static Singleton instance = null;
private Singleton() {
//私有的构造方法,作用不说了,你懂的
}
//对外的接口,在使用方法的同时,就直接创建实例了
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
总结一下:懒汉式单例与饿汉式单例的区别是初始化推迟到到用的时候,才开始实例对象,但是前2个都是单线程时候,但多线程就存在资源问题了,那如何做的,注意哪,饿汉式单例不会存在问题,记住了,它是在类加载时,就存在了,没有抢夺资源的问题,但是懒汉式就不一样,它是有个getInstance向外部提供接口,存在多个对象去访问,自然有资源问题。
那怎么呢?我们可以加风平同步锁就可以了
public class Singleton {
private static Singleton instance = null;
private Singleton() {};
public static Singleton getInstance() {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
}
这样就可以,但还有很多方法,可以去防止,比如静态类,枚举。等等,就不会总结了