Java_单例模式饿汉式和懒汉式

提示:单例设计模式入门,同学们最好是把我这里的代码赋值到自己的开发环境,然后根据我的说明来一步一步实操。


一、单例设计模式是什么?

在整个系统中,对与某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法

二、两种单例设计模式

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对象。为什么叫饿汉式,原因在于,我们不调用这个方法,我们其实在内存中并不会创建对象,通过上面的实例我们可以验证这个

猜你喜欢

转载自blog.csdn.net/ming2060/article/details/127802557