单例设计模式是23种设计模式中最常见,也是最容易理解的设计模式,之前有很多人写过单例模式,千篇一律,各抒己见…
我们都知道:一个类的内在加载分解过程为:
- new出来的对象在堆中。
- 全局变量存储在全局数据区中。
- 局部变量存储在栈区。
- 普通方法存在方法区。
- static修饰的方法则在静态方法区中。
- 静态方法的加载优先于普通方法加载。
- 静态方法并且可以通过类名点方法名(class.method)调用,普通方法必须先new对象才能调用。
- 全局变量的范围要大于局部变量的使用范围。
而单例模式,其构造方法是私有的,对象自己先new自己于堆中,其所有的普通方法都是在方法区中。
单例模式常用有两种形式:懒汉式和饿汉式,
其中要考虑的是这两种单例形式是事否在多线程下使用:
如果是在多线程下使用,那么就使用饿汉式。
为什么呢(小沈阳的疑问)?
在多线程的情况下,例如两个线程下使用懒汉式,第一线程刚创建完准备要返回就被第二线程抢到了又重新创建了一遍,这时就有两个对象存在了,那就不符合单例的原则了,所以才有了饿汉式单例,无论是一线程还是二线程抢到使用,对象都只有一个…
1.懒汉式:需要时才创建于堆中,多线程情况下不能保证唯一性
/**
* Created by bob on 2017/5/22.单例之懒汉式
*/
public class Singleton {
private static String TAG = "Singleton";
private static Singleton singleton = null;
private Singleton() {//单例的特点,构造必须私有
}
public static Singleton getInstance() {
if (null == singleton) {
singleton = new Singleton();
}
return singleton;
}
public void printStr() {
Log.i(TAG, "初始化后调用了...");
}
}
2.饿汉式:一使用就创建,并且唯一
/**
* Created by bob on 2017/5/22.单例之饿汉式
*/
public class Singleton {
private static String TAG = "Singleton";
private static Singleton singleton = new Singleton();
private Singleton() {//单例的特点,构造必须私有
}
public static Singleton getInstance() {
return singleton;
}
public void printStr() {
Log.i(TAG, "初始化后调用了...");
}
}
那么我们常用单例模式做什么操作呢?
1.封装一些常用的工具类,保证整个应用常用的数据统一
2.保存一些共享数据在内存中,其他类随时可以读取。
其次是单例使用的优缺点:
优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
好了,单例就写到这里,有什么错误的地方请留言,觉得帮助到你的话请点个赞就是对作者的鼓励…