前言
很多时候,一个类被要求只能实例化一次,比如说任务管理器(不能打开多个),安卓开发中的fragment。这时候就要考虑单列模式,让一个类只能实例化一个对象。
介绍
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
代码
下面给出单例模式的几种实现方法:
1.饿汉式1
该方法将类的构造器私有化,在类中私有地创建对象,再通过public方法返回对象a的引用。所以对对象的调用只能通过A.get_a()获取。值得注意的是,为了 直接通过类名调用方法,获取对象的方法需要用static来修饰。而static方法中只能调用静态属性,所以在创建对象时也要用static修饰。且,静态属性(对象a)属于类本身而不属于类的任何实例,可以被看做是存储在类当中的全局变量。
class A{
private A() {}//私有化构造器
private static A a = new A();//创建对象时,static修饰
public static A get_a() {//获取对象的方法
return a;
}
public void method() {
System.out.println("A中方法被调用");
}
}
public class Test {
public static void main(String[]args) {
//该单例模式下类的实例化
//A.get_a()每次返回的都是静态变量a
A.get_a().method();//调用方法,输出
}
}
2.饿汉式2
其实和上面的方法差不多,只不过将对象a的实例化放在了静态代码块里了。静态代码块随着类的加载而执行,且只执行一次。所以对象a只被实例化一次。
class A{
private A() {}//私有化构造器
private static A a = null;//可以看作全局变量,刚开始a为null,静态代码块加载后被实例化
static{
a = new A();//在A加载的时候执行一次,以后不再执行
}
public static A get_a() {
return a;
}
public void mothod() {
System.out.println("A中方法被调用");
}
}
public class Test {
public static void main(String[]args) {
A.get_a().mothod();
}
}
3.懒汉式
与饿汉式2基本相同,只是没用静态代码块的特性,而是采用每次调用静态方法时判断对象a是否为空,为空则实例化。
class A{
private A() {}//私有化构造器
private static A a = null;//可以看作全局变量,刚开始a为null,静态代码块加载后被实例化
public static A get_a() {
if(a==null){
a = new A();
}
return a;
}
public void mothod() {
System.out.println("A中方法被调用");
}
}
public class Test {
public static void main(String[]args) {
A.get_a().mothod();
}
}