JAVA中的单例模式是一种广泛使用的设计模式,是Java里23种设计模式之一。单例模式的作用是保证在JAVA程序中,某个类只有一个程序存在。
这里简单介绍其两种基本写法:饿汉式和懒汉式。
饿汉式与懒汉式区别在于饿汉式在类加载时就对实例进行创建,优点是线程安全,缺点是不管用不用都占用内存;懒汉式是单例在需要的时候采取创建的,如果单例已经创建,再次调用将不会创建新的对象,而是直接返回之前创建的对象,优点是占用内存小,缺点是加载速度慢,线程不够安全;
这里以车举例,同时定义一个成员变量司机来证实唯一性。
饿汉式
public class Car { //创建车类
private String driver; //定义成员变量司机名
private static Car car = new Car() //直接在初始化成员变量时实例化一辆车;
private Car() { //为保证车的唯一,将构造方法设为私有的,这样类外面就无法使用new Car()来实例化一辆车了;
}
public static Car getCar() { //定义一个公开的成员方法,用来获取这辆车;
return car;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
}
懒汉式
public class Car {
private String driver;
private static Car car; //定义成员变量车,其类型是类本身;默认为null
private Car() {
}
public static Car getCar() {
if (car == null) { //当这辆车指向为null时,实例化一辆车,如果不是null,返回这辆车;
car = new Car();
}
return car;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
}
测试
public class Test{
public static void main(String[] args) {
Car car1 = Car.getCar(); //直接用类名调用静态方法获取一辆车;对象名为car1
Car car2 = Car.getCar(); //再次调用方法获取一辆车;对象名为car2
car1.setDriver("小明"); //将car1的司机命名为小明
System.out.println(car2.getDriver()); //打印car2的司机名仍然是小明,说明这两辆车是同一辆车,也就证明了这辆车的唯一性。
}
}