在进行java设计时,为了保证某些类只能被创建一次,将类的构造器定义为private,使用new时将无法创建对象,在具体使用时又可以分为饿汉式和懒汉式。
(1)饿汉式
将构造器定义为private,同时将类创建过程定义为私有的静态属性,为了可以使外部获取创建的类,定义一个静态方法getInstance()。饿汉式顾名思义,只要类完成了加载,就会创建对象。因此无论是访问静态变量sal或调用静态方法getInstance(),都可以完成类的创建。
1. public class designMode {
public static void main(String[] args) {
double sal = hungryMode.sal;
hungryMode hm = hungryMode.getInstance();
System.out.println(hm.toString());
} }
class hungryMode {
private String name;
private int age;
private static hungryMode hm = new hungryMode("jack", 10);
public static double sal = 0.0;
public hungryMode(String name, int age) {
System.out.println("构造器被调用");
this.name = name;
this.age = age;
}
public static hungryMode getInstance() {
return hm;
}
@Override
public String toString() {
return "hungryMode{" +
"name='" + name + ''' +
", age=" + age +
'}';
} }
(2)懒汉式
懒汉式和饿汉式的区别在于,如果没有调用getInstance()方法,即使类进行了加载,如访问静态属性sal,也不会创建对象,且getInstance()方法中的if判断保证了对象仅被创建一次。但是懒汉式相比于饿汉式存在线程安全的问题,当多个线程调用getInstance()方法时,若先到达的未创建对象完毕,可导致对象多次创建(解决方法待续。。。)。
public class designMode {
public static void main(String[] args) {
double sal = lazyMode.sal;
lazyMode hm = lazyMode.getInstance();
System.out.println(hm.toString());
}
}
class lazyMode {
private String name;
private int age;
private static lazyMode lm;
public static double sal = 0.0;
public lazyMode(String name, int age) {
System.out.println("构造器被调用");
this.name = name;
this.age = age;
}
public static lazyMode getInstance() {
if (lm == null) {
lm = new lazyMode("lazy", 10);
return lm;
}
return lm;
}
@Override
public String toString() {
return "lazyMode{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
其他模式待续。。。



