解决问题:保证一个类在内存中只有一个对象
比如用户向服务器发送请求,如果每一个用户过来,都实例化一个对象,那么当人很多的情况下,服务器就爆了。
cpu在一个时间段只能有一个线程执行。
比如两个线程同时执行,或者多个线程,那么当一个程序执行到某一个位置,突然,想往下一个程序执行的时候,但是下一个程序段有被占用,这个时候它就不能动了。然后只等这个程序执行才能动。
这个后面会涉及到线程安全的问题
单例设计模式分为饿汉设计模式与懒汉设计模式
我不想喝水,但是我先把水买好,你可以比作对象:饿汉
我可能渴了想喝,但是呢,我不到关键时候我不会去买水喝:懒汉
//饿汉
/*
1.私有化构造函数,一旦找不到构造函数,jvm就无法去实例化一个对象
2.外部依然创建本对象,那么我们就在自身的内部创建一个变量引用一个对象
3.做一个公共接口,返回这个对象
/*class Single
{
private static Single s=new Single();//内部创建一个变量引用一个对象,只会在静态代码区存放一片地址
//默认的构造函数,设置成私有的
private Single(){};
//公共接口返回这个对象,这个必须静态,因为外部没有对象,只有类
public static Single getInstance()
{
return s;//因为他是不能访问非静态成员
}
}*/
下面说一下懒汉设计模式:
/*
1.私有化构造函数,一旦找不到构造函数,jvm就无法去实例化一个对象
2.创建一个对象变量,但是我不马上实例化它,因为我们懒
3.渴了,需要喝水了,我要实例化对象(注意多线程占用的问题)
*/
class Single
{
private static Single s;//我不饿,我先放着
private Single(){};//封闭这个对象
public static Single getInstance()
{
//先来判断对象有没有被实例
if(s==null)
{
s=new Single();
}
return s;
}
}
介绍一下单例的一个实例,也就是由传参的构造函数。
上面就是在内部传入了一个带参的构造函数,但是,这个参数是不能改变的,他只能维护一个静态对象,放在静态区里面
下面就是实现代码: