提示:单例设计模式入门,同学们最好是把我这里的代码赋值到自己的开发环境,然后根据我的说明来一步一步实操。
一、单例设计模式是什么?
在整个系统中,对与某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
二、两种单例设计模式
1.饿汉式
代码如下(示例):
public class SingleTon01 {
public static void main(String[] args) {
//System.out.println(Animal.n1);
System.out.println(Animal.getInstance());
}
}
class Animal{
private String name;
public static int n1 = 888;
private static Animal dog = new Animal("dog");//2,在类的内部new一个对象
//分析:这里为什么要用static,因为我们的构造器私有化了,我们在main中new不出对象,又因为
//我们创建的该对象用了private,所以,我们即使用类名来调用也无济于事,我们需要写一个公共
// 方法getInstance()来获得该对象。所以此getInstance()方法也要用static,又因为静态方法
//必须调用静态成员,所以我们这里的static必须加上
private Animal(String name) {//1,构造器私有化
System.out.println("构造器被调用");
this.name = name;
}
public static Animal getInstance(){//3,提供一个static方法,返回dog
return dog;
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
'}';
}
}
运行结果如下(示例):
构造器被调用
Animal{name='dog'}构造器被调用//把System.out.println(Animal.n1);打开
888
Animal{name='dog'}
分析:
不管我们有没有用Animal.n1()该条语句,始终我们的构造器都被调用了,原因是我们在Animal类中就new了对象了。所以我们这个dog不管我们调不调getInstance()方法,我们都能的到该对象,当然我们可以再getInstance()一遍,来返回他们的地址,这个大家自己去调试,绝对是同一个地址。
2.懒汉式
代码如下(示例):
public class SingleTon02 {
public static void main(String[] args) {
System.out.println(Cat.n2);
System.out.println(Cat.getInstance());
System.out.println(Cat.getInstance());
System.out.println(new Dog("大黄"));
System.out.println(new Dog("大黄"));
}
}
class Cat{
private String name;
public static int n2 = 999;
private static Cat cat; //2,给一个static静态属性对象
private Cat(String name) {//1,构造器私有化
//这条语句在单独使用Cat,n2方法时是不会被调用的
//System.out.println("构造器被调用");
this.name = name;
}
public static Cat getInstance(){//3,提供一个public的static的方法来返回我们的Cat对象
if (cat == null){
cat = new Cat("小白");
}
return cat;
}
}
class Dog{
private String name;
public Dog(String name) {
this.name = name;
}
}
运行结果如下(示例):
第一种情况:就是上面代码的运行结果
999
review.SingTon.Cat@4b67cf4d
review.SingTon.Cat@4b67cf4d
review.SingTon.Dog@7ea987ac
review.SingTon.Dog@12a3a380
第二种情况:这个是只运行System.out.println(Cat.n2);把main中底下的System.out.println()全部关掉。且把屏蔽System.out.println("构造器被调用")打开。
999
分析:可以先单独执行Cat.n2语句(将底下语句屏蔽),执行完可以发现,构造器没有被调用,原因是我们在Cat类中前面只定义了cat,并没有new对象,所以构造器不会被执行。但是我们将构造器中的提示语句打开,并且调用getInstance()方法,可以得到两个地址一样的对象,说明这两个是一个对象。最后我们写了一个普通Dog()类,并new对象,发现两个的地址是不同的,这里就验证了我们所说的单例模式只有唯一对象
总结
饿汉式:1,将构造器私有化;2,在类的内部直接创建对象(该对象是static);3,提供一个公共的static方法,返回相对应的对象。为什么叫饿汉式,有可能这个对象已经创建好了,但是我们还没来的急去用。这种模式会造成资源浪费。
懒汉式:1,将构造器私有化;2定义一个static静态属性对象;3,提供一个public的static方法,可以返回一个cat对象。为什么叫饿汉式,原因在于,我们不调用这个方法,我们其实在内存中并不会创建对象,通过上面的实例我们可以验证这个