java 从构造方法私有化引出单例模式

问题的引出

当对一个类的构造方法进行私有化以后,我们不能以new的形式新建一个对象,去调用对象的方法。如下:

class Singleton{
    private Singleton(){
    }
    public void print(){
        System.out.println("hello world");
    }
}

这个时候我们调用print()方法,需要如下:

@Test
public void test(){
    Singleton s1 = null;
    s1 = new Singleton();
    s1.print();
}

程序编译的时候会报错。

探讨解决办法

既然我们不能再外部去实例化一个对象,那么在类内部实例化呢。

class Singleton{
    Singleton singleton = new Singleton();
    private Singleton(){
    }
    public void print(){
        System.out.println("hello world");
    }
}

程序编译通过。但是测试方法扔不可运行,也就是说此时是重点在于如何将内部的singleton对象传递到类的外部去。前面说过,由static标注的属性可以由类直接访问,那么上面的类改造一下:

class Singleton{
    static Singleton singleton = new Singleton();
    private Singleton(){
    }
    public void print(){
        System.out.println("hello world");
    }
}
@Test
public void test(){
    Singleton s1 = null;
    s1 = Singleton.singleton;
    s1.print();
}

run result:

hello world

但是这样做本身也存在问题,因为我们知道类中的属性一般情况下需要封装。而属性封装之后,必须通过方法来获取属性,那么这个方法也必须声明为static方法。

问题解决

于是类将变成如下:

class Singleton{
    private static Singleton singleton = new Singleton();
    private Singleton(){
    }
    public static Singleton getInstance(){
        return singleton;
    }
    public void print(){
        System.out.println("hello world");
    }
}

test:

@Test
public void test(){
    Singleton s1 = Singleton.getInstance();
    Singleton s2 = Singleton.getInstance();
    Singleton s3 = Singleton.getInstance();

    s1.print();
    s2.print();
    s3.print();
}

result:

hello world
hello world
hello world

因为所有的类共享static属性,虽然以上我们实例化了三个对象,但是他们都是指向同一个引用。也就是说不管外面如何使用,最终结果也只有一个实例化对象存在。这种模式在设计模式中被称为单例模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值