黑马程序员——java基础—单例设计模式

时间:2022-07-02 00:44:25

------- 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时也为空,创建了一个对象,第一个线程在运行时就又创建一个对象,不能保证单例了。

这时我们想到了锁。

总结:即便懒汉式能确保只创建一个对象,但是耗时太多,不如饿汉式方便。

面试点:  ifs==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
}
}