------- android培训、java培训、期待与您交流! ----------
单例设计模式
设计模式指的是解决某一类问题行之有效的解决办法。
单例模式可以保证一个类的对象唯一性。
比如多个程序都要使用同一个配置文件中的数据,且要实现数据共享和交换。必须要将数据封装到一个对象中,让不同的程序操作的是同一个对象。也就是说必须保证这个配置文件的对象唯一性。这个时候就是用单例。
饿汉式与懒汉式
1.饿汉式单例设计模式:这是先初始化对象,称为:饿汉式。 SingleDemo类一进内存,就已经创建好了对象。
<pre name="code" class="java"> //饿汉式单例设计模式
class SingleDemo {
//初始化一个静态本类对象,对,是本类对象。且本类对象在类初始化的时候就被创建。
//可以理解成,饿汉很饿,要迫不及待的将本类对象吃到肚子里。
private static SingleDemo s = new SingleDemo();
//单例设计模式首先要有自己的私有,对,私有构造函数
private SingleDemo(){}
public SingleDemo getString(){
return s;
}
}
2.懒汉式单例设计模式:该单例模式在被调用方法时,才初始化对象,也叫对象的延时加载。称为:懒汉式。
注意:缺点:如果当线程刚执行完If(s==null)语句,该线程失去执行权,而另一个线程也运行该代码,判断s时也为空,创建了一个对象,第一个线程在运行时就又创建一个对象,不能保证单例了。
这时我们想到了锁。
总结:即便懒汉式能确保只创建一个对象,但是耗时太多,不如饿汉式方便。
面试点: if(s==null)
{
Synchronized(SingleDemo2.class)
{
if(s==null)
s= new SingleDemo2()
}
}
<pre name="code" class="java"> //懒汉式单例设计模式
class SingleDemo2 {
//初始化一个静态本类对象,对,是本类对象
private static SingleDemo2 s = null;
//单例设计模式首先要有自己的私有,对,私有构造函数
private SingleDemo2(){}
//懒汉式单例设计模式在被调用方法的时候才初始化对象,对,懒汉很懒,被调用的时候才初始化
public SingleDemo2 getString(){
if(s==null)
s = new SingleDemo2();
return s;
}
}
//描述超人。
class SuperMan
{
private String name;//私有属性
private static SuperMan man = new SuperMan("克拉克");//初始化一个本类对象
private SuperMan(String name)
{
this.name = name;
}
public static SuperMan getInstance()//获取本类对象的方法
{
return man;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
public void fly()
{
System.out.println(this.name +"..fly");
}
}
class SingleTest
{
public static void main(String[] args)
{
//超人对象应该是唯一的。保证superMan的唯一性。可使用单例模式解决。
// SuperMan man = new SuperMan("克拉克");//单例不能new对象,它的构造函数是私有的
//man1、man2分别获取SuperMan的对象,因为SuperMan使用的是单例设计模式,所以他们获得的对象是同一个
SuperMan man1 = SuperMan.getInstance();
SuperMan man2 = SuperMan.getInstance();
man1.setName("英雄");//单例设计模式可以实现数据的共享和交换
man2.fly();//输出:英雄...fly
}
}