* 单列设计模式:可以保证一个类在内存中的对象唯一性 * 使用场景:对于多个程序必须使用同一个配置信息对象是,就需要保证该对象的唯一性。 * 如何保证唯一性的步骤: 1.不允许其他程序用new创建该类对象; 2.在该类创建一个本类实例; 3.对外提供一个方法让其他程序可以获取该对象 实现步骤: 1.私有化该类构造函数 2.通过new在本类中创建一个本类方法 3.定义一个共有的方法,将创建的对象返回
弊端:懒汉式在多线程时,可能不能保证对象的唯一性,存在安全隐患
//类一加载对象就已经存在
class Single{
//2.通过new在本类中创建一个本类方法
//一般成员变量都是私有化,这样可控,如果不加private成员变量不可控
private static Single s = new Single();
//1.私有化该类构造函数
private Single(){}
//3.定义一个共有的方法,将创建的对象返回
//这个方法为什么是static,因为
//方法被调用有两种方法:对象调用 和类名调用
// 类名调用有一个前提:方法必须是静态,被类名访问的内容必须是静态
public static Single getInstance(){
return s;
}
}
/*方法被调用有两种方法:对象调用 和类名调用
类名调用有一个前提:方法必须是静态,被类名访问的内容必须是静态
*/
class SingleDemo {
public static void main(String[] args){
//类名调用
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
}
}
如果成员变量s 不加private,会变得不可控,如下
class SingleDemo {
public static void main(String[] args){
Single s1 = Single.getInstance();
//s是成员变量,而且静态,可以被类名直接调用,但是不可控
Single s2 = Single.s;
}
class Single{
//2.通过new在本类中创建一个本类方法
//s是成员变量,而且静态,可以被类名直接调用
static Single s = new Single();
private Single(){}
public static Single getInstance(String name){
return s;
}
}
单例模式举例:
/**
使用单例模式前:
t1、t2是不同的对象
*/
class SingleDemo {
public static void mian(String[] args){
Test t1 = new Test();
Test t2 = new Test();
t1.setNum(10);
t2.setNum(20);
System.out.println(t1.getNum()); //10
System.out.println(t2.getNum()); //20
}
}
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){
Test t1 = Test.getInstance();
Test t2 =Test.getInstance();
t1.setNum(10);
t2.setNum(20);
System.out.println(t1.getNum()); //20
System.out.println(t2.getNum()); //20
}
}
class Test{
private int num;
//单例三部曲
private static Test t = new Test();
private Test(){}
public static Test getInstance(){
return t;
}
public void setNum(int num){
this.num = num;
}
public int getNum(){
return num;
}
}