JAVA设计模式之单例设计模式

设计模式

设计模式就是对于问题行之有效的解决方式.
总的来说就是一种思想.
解决问题的思想.
每一种语言(c++, JavaScript等)都有其对应的设计模式.
.
.
.
.
单例设计模式:

解决问题:
		就是可以保证一个类在内存中的对象唯一性
 比如:
         对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性
 如何保证对象唯一性呢?
	1.不允许其它程序用new创建该类对象.
	2.在该类中创建一个本类实例.
	3.对外提供一个方法让其它程序可以获取该对象.
 步骤:
        1.私有化该类构造函数
        2.通过new在本类创建一个本类对象
        3.定义一个公有的方法,将创建的对象放回.
class Single{

     private static Single s = new Single(); //对象静态私有化

    private Single(){}//构造函数私有化

    public static Single getInstance()  //这样变得可控
    {
        return s;
    }


}

public class SingleDemo {
    public static void main(String[] args){
        Single s1 = Single.getInstance(); 
        //对象私有化了,所以不能new,直接通过调用
        Single s2 = Single.getInstance();
        System.out.println(s1==s2);			//判断它们的地址值是不是相等
        }
}        

输出结果:
在这里插入图片描述

可以测试一下是否正确
代码如下:

public 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());
	}
}

class Test{

	private static Test t = new Test(); //对象静态私有化
	
	private int num;	//定义一个int类型的私有化变量 num
	
	private Test(){}	//私有化构造函数使其不能new出对象
	
	public static Test getInstance()	//变得可控
	{
		return t;
	} 
	public void setNum(int num)	//对外提供的方法:获取
	{
		this.num = num;
	}
	public int getNum() //对外提供方法:得到
	{
		return num;
	}
}

结果:
在这里插入图片描述
另一种单例设计模式的代码

class Single2{

     private static Single s = null; //对象静态私有化

    private Single(){}//构造函数私有化

    public static Single getInstance()  //这样变得可控
    {
        if(s==null)
        {
        	s = new Single();
        }
        return s;
    }
}

内存图解

第一种单例设计模式

class Single{

     private static Single s = new Single(); 

    private Single(){}

    public static Single getInstance()  
    {
        return s;
    }
}

public class SingleDemo {
    public static void main(String[] args){
    
        Single s1 = Single.getInstance(); 
        
        Single s2 = Single.getInstance();
        
        System.out.println(s1==s2);	
        }
}		

在这里插入图片描述
然后主函数(main)进栈
Single随着虚拟机的启动就已经加载进方法区了
在这里插入图片描述
在这里插入图片描述

 private static Single s = new Single(); 
 new了一个叫s的对象,
 于是在堆形成

对象s指向了堆里的地址
在这里插入图片描述

Single s1 = Single.getInstance(); 

s1 获取了s的地址,于是指向了同一个堆内存的地址

在这里插入图片描述

Single s2 = Single.getInstance();

s2也获取了s的地址,于是指向了同一个堆内存的地址
在这里插入图片描述
这样就完成了保证一个类在内存中的对象唯一性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值