单态:就是保证一个类在内存中只有一份(只有一个对象)。也就是类只存在一个实例。
1.别人不能建立对象;所以要私有化(对构造函数私有化),只在我的本类中有效。
2.别人不能建立对象;我就要在本类中建立一个对象,准备让别人来调用。
3.别人要调用我的对象;所以要提供一个方法,来获取我定义的实例。
4.对象不能调用;所以就要是静态的方法。从而成员变为静态的。
class Single{
//1.
private single(){}
//2.
private Single s = new Single();
//3.
publie Single getSingle(){
return s;
}
}
看上去好像是写完了。
别人如何调用呢?
调用方法的方法(两种):1.用对象调用。2.用类名字调用。
在这里没有对象所以就要用类名来调用。类名想调用所以方法就要是静态的。方法是静态的,所以它访问的成员应该是静态的,也就是
private Single s = new Single();应该给为 private static Single s = new Single();
publie Single getSingle()应该改为 publie static Single getSingle()
class Single{
//1.
private single(){}
//2.
private static Single s = new Single();
//3.
publie static Single getSingle(){
return s;
}
void show(){
System.out.println("first single");
}
}
class DemoSingle{
public static void man(String[] args){
//获得Single对象
Single single = Singel.getSingle();
single.show();
}
}
在Single 类中只要在想要单态时候才用实现这三步。得到类对象之后就可以用它干别的事情。调用别的方法。
另外一种单态的写法:
class Single{
//1.
private single(){}
//2.
private static Single s = null;
//3.
publie static Single getSingle(){
if(s==null){
s = new Single();
}
return s;
}
void show(){
System.out.println("single second");
}
}
class DemoSingle{
public static void man(String[] args){
//获得Single对象
Single single = Singel.getSingle();
single.show();
}
}
在用时候要考虑线程安全。第二种时必须要加关键字synchronied;所以最好用第一种。