软件从开始到结束的运行过程中,包获赠某一个类只有一个实例(对象)
package 设计模式.单例设计模式;
//饿汉式
public class Single01 {
public static void main(String[] args) {
//通过方法获取对象(类加载的时候,对象就已经创建了)
girlFriend ins = girlFriend.getInstance();//不用加new
System.out.println(ins.toString());
girlFriend ins2 = girlFriend.getInstance();//不用加new
System.out.println(ins.toString());
//这两次获取对象其实是获取的同一个对象
System.out.println(ins == ins2);
}
}
class girlFriend {
private String name;
public static int n1 = 100;
//为了在公共的static方法中返回对象,需要修饰为static
private static girlFriend gir = new girlFriend("小红");//2.在类的内部创建对象
//单例--只创建一个对象
//1.构造器私有化
private girlFriend(String name) {
this.name = name;
}
//3.提供一个公共的static方法,返回对象
public static girlFriend getInstance() {
return gir;
}
@Override
public String toString() {
return "girlFriend{" +
"name='" + name + '\'' +
'}';
}
}
package 设计模式.单例设计模式;
//单例设计模式--懒汉式(和饿汉式区别是,懒汉式的类加载的时候对象不创建)
//其实就相当于把返回对象的内个方法加个判断
public class Single02 {
public static void main(String[] args) {
// new Cat("xiaoming");
Cat instance = Cat.getInstance();//调用方法的时候,cat为空
System.out.println(instance);
Cat instance2 = Cat.getInstance();
//第二次调用这个方法的时候,因为之前调用过,所以cat不为空,就相当于返回了上次创建的对象
System.out.println(instance);
System.out.println(instance == instance2);
}
}
//希望在程序运行过程中只能创建一个对象
class Cat {
private String name;
private static Cat cat;//2.定义一个静态属性的对象(默认为null)
//步骤1.构造器私有化(这样的话main方法里面【外部类】不能new一个对象)
private Cat(String name) {
this.name = name;
}
//3.提供一个公共的static方法,返回对象
public static Cat getInstance() {
if (cat == null) {//如果还没创建对象,就给他创建一个
cat = new Cat("小可爱");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
二者的区别就是对象创建时机不同,饿汉式是加载类的时候就创建对象,懒汉式只有自己调用方法的时候才能创建对象(这样防止了资源浪费,这也是懒汉式相对于饿汉式的优点),懒汉式相对于饿汉式的缺点就是容易存在安全问题(多线程),这个问题之后在解决