一般我们获取一个类对象的时候一般会使用new关键字,也就是调用这个类的无参构造器,这样我们就会得到这个类的多个对象。 但是我们现在需要的是只要我们使用这个类获取的就是同一个对象,所以我们在编写这个类的无参构造器时就要使用private修饰。
//饿汉模式 //不管用不用 先创建对象 占用资源 线程安全 public class SingleClass { private static SingleClass t = new SingleClass(); private SingleClass() { } public static SingleClass setB() { return t; } }测试一下
public class SingleTest { public static void main(String[] args) { singleClass s = singleClass.setB(); singleClass s1 = singleClass.setB(); System.out.println("第一个对象:"+s); System.out.println("第二个对象:"+s1); } }结果: 还有一种方式
//懒汉模式 //需要才创建对象 线程不安全 public class singleClass1 { private static singleClass1 t; private singleClass1() { } public static singleClass1 setA() { if(t==null) { t = new singleClass1(); } return t; } }测试一下
public class SingleTest { public static void main(String[] args) { singleClass1 s = singleClass1.setA(); singleClass1 s1 = singleClass1.setA(); System.out.println("第一个对象:"+s); System.out.println("第二个对象:"+s1); } }结果: 这两种方式在java里被称为饿汉模式和懒汉模式
再说一个题外话,如果我就想获取这个类的不同对象咋办。 这里我们就要用到反射了。 这里只写一个饿汉模式的反射
import java.lang.reflect.Constructor; public class SungleClassFan { public static void main(String[] args) { Class<singleClass> c = singleClass.class; System.out.println(c.getName()); try { Constructor<singleClass> con=c.getDeclaredConstructor(); con.setAccessible(true); singleClass single = (singleClass)con.newInstance(); System.out.println(singleClass.setB()); System.out.println("无参私有构造方法:"+single); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }结果: