设计模式
设计模式就是对于问题行之有效的解决方式.
总的来说就是一种思想.
解决问题的思想.
每一种语言(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的地址,于是指向了同一个堆内存的地址
这样就完成了保证一个类在内存中的对象唯一性