-------
android培训、
java培训、期待与您交流! ----------
设计模式:
解决某一类问题最行之有效的方法,Java中23种设计模式。
单例模式(Singleton pattern):
解决一个类在内存中只存在一个对象比如对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
需求:
一个类在内存只存在一个对象。
思路(怎么保证对象唯一?):
1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象;
2.还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象;
3.为了方便其他程序对自定义对象的访问, 可以对外提供一些访问方式;
步骤:
1,将构造函数私有化。
2,在类中创建一个本类对象。
3,提供一个方法可以获取到该对象。
单例模式在创建一个本类对象和获取实例的方法时,为什么要是静态的?
单例模式只存在一个对象,要保证对象唯一,只能在内部创建对象,所以方法不能使用对象名调用,那就只能类名调用,所以本类对象和获取实例的方法要是静态的。
单例模式有两种写法
1.饿汉式:一上来就创建对象
Single类一进内存,就已经创建好了对象。
思路:
(1)将构造函数私有化;
(2)在类中创建一个本类对象;
(3)提供一个公共的访问方法,可以获取到该类对象;
代码
//饿汉式:声明时就初始化对象
class Single{
//为了避免其他程序过多建立该类对象,将构造函数私有化
private Single(){
}
//为了让其他程序可以访问到该类对象,在类中创建一个本类对象
private static Single s = new Single();
//获取实例,为了让其他程序可以获取到该类对象,提供一个访问本类的静态方法
public static Single getInstance(){
return s;
}
}
2.懒汉式:等用的时候再创建对象
方法被调用时对象才被创建,也叫做对象的延时加载。
Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
代码
//懒汉式:等到方法被调用时才初始化,也叫做对象的延时加载。
class Single{
//为了避免其他程序过多建立该类对象,将构造函数私有化
private Single(){
}
private static Single s;
//为了让其他程序可以获取到该类对象,提供一个访问本类的静态方法
public static Single getInstance(){
if(s==null)
{
//将同步内容下方到if内部,减少锁的判断次数,提高了执行的效率,不必每次获取对象时都进行同步。
synchronized(Single.class)
{
if(s==null){
//创建一个本类对象
s = new Single();
}
}
}
return s;
}
}
为什么有饿汉式还会有懒汉式?
原因就是对了面试,因为面试都是考懒汉式,因为要考虑到了多线程安全问题,使程序更加严谨。实际开发中用饿汉式,因为在考虑多线程时会比较安全,懒汉式的解决安全问题的方法,双重判断,加入锁。
懒汉式出现的问题:
安全问题,在使用多线程中会出现安全问题。