单例设计模式
目录
5、单例设计模式内存图解
一、设计模式:
对问题行之有效的解决方式,本质是一种思想。
二、单例设计模式
1、单例设计模式解决的问题:
保证一个类在内存中的对象唯一性,比如对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性
2、单例设计模式如何保证对象的唯一性?
1、不允许其他程序用new创建该类对象。
2、在该类创建一个本类实例对象。
3、对外提供一个方法让其他程序可以获取该对象
3、单例设计模式设计步骤:
1、私有化该类的构造函数
2、通过new在本类中创建一个本类对象
3、定义一个公有的方法,将创建的对象返回
4、单例设计模式具体实例
class Single //单例模式类
{
//私有化该类的构造函数
private Single(){}
//通过new在本类中创建一个本类对象
private static Single s = new Single();//变私有只是为了数据可控
//定义一个公有的方法,将创建的对象返回
public static Single getInstance()
{
return s;
}
}
class Test //用来对比的非单例模式类
{
private int num;
public void setNum(int num)
{
this.num = num;
}
public int getNum()
{
return num;
}
}
class SingleDemo
{
public static void main(String[] args)
{
//调用单例模式类中成员,不需要新建对象
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
//对比s1与s2中的数据是否相同
System.out.print("s1=s2? ");
System.out.println(s1==s2);
//调用普通类
Test t1 = new Test();
Test t2 = new Test();
t1.setNum(10);
t2.setNum(20);
System.out.println("t1="+t1.getNum());
System.out.println("t2="+t2.getNum());
//对比t1和t2中的数据是否相同
System.out.print("t1=t2? ");
System.out.println(t1.getNum()==t2.getNum());
}
}
运行结果
我们通过单例模式类的创建步骤,对我们的Test类进行修改,修改为单例模式,如下:
class Test
{
private int num;
//私有化该类的构造函数
private Test(){}
//通过new在本类中创建一个本类对象
private static Test t = new Test();
//定义一个公有的方法,将创建的对象返回
public static Test getInstance()
{
return t;
}
public void setNum(int num)
{
this.num = num;
}
public int getNum()
{
return num;
}
}
class SingleDemo
{
public static void main(String[] args)
{
Test t1 = Test.getInstance();
Test t2 = Test.getInstance();
t1.setNum(10);
t2.setNum(20);
System.out.println("t1="+t1.getNum());
System.out.println("t2="+t2.getNum());
System.out.print("t1=t2? ");
System.out.println(t1.getNum()==t2.getNum());
}
}
运行结果
5、单例设计模式内存图解
(左上:栈内存 右上:堆内存 左下:方法区 右下:静态方法区)
6、单例设计模式常用的两种构造方式
1、方式一:饿汉式(常用)
class Single //类一加载,对象就已经存在了
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
2、方式二:懒汉式(面试常用)
class Single2 //类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象
{ //延迟加载形式
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance()
{
if(s==null)
s = new Single2();
return s;
}
}