构造方法私有化----单例设计模式

目录

 一 、问题引出

二 、问题的解决

三 、程序的意义


 

类的封装性不止体现在对属性的封装,实际上方法也是可以封装的,构造方法私有化就是对构造方法进行封装

 一 、问题引出

先有以下的封装:

class Singleton {
    private Singleton() {  //对构造方法进行封装

    }
    public void print() {
        System.out.println("hello world!");
    }
}
public class SingletonDemo1 {
    public static void main(String[] args) {
        Singleton s1 = new Singleton();   //错误,无法实例化
    }
}

在主方法中实例化对象时,由于构造方法被封装,此时程序编译报错:

 

二 、问题的解决

 以上程序在类的外部无法调用到类内部的私有构造方法进行实例化对象,那么,我们是否能在类内部实例化对象,之后再把对象传递到外部呢?所以解决问题的关键在于如何将内部实例化后的对象传递到类的外部去。

static 类型的属性可以由类名称直接调用,所以此时可以将类内部实例化的对象声明为 static 类型,在类的外部通过类名称直接调用。

class Singleton {
    private static Singleton instance = new Singleton();  //声明 static 对象实例
    public static Singleton getInstance() {
        return instance;
    }
    private Singleton() {  //对构造方法进行封装

    }
    public void print() {
        System.out.println("hello world!");
    }
}

public class SingletonDemo02 {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();  //取得类中 static 对象实例
        Singleton s2 = Singleton.getInstance();  //取得类中 static 对象实例
        Singleton s3 = Singleton.getInstance();  //取得类中 static 对象实例

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

程序运行结果:

 

三 、程序的意义

以上代码将构造方法私有化之后,程序正常执行,代码比之前直接实例化对象复杂了一些,那么将构造方法实例化究竟有什么意义呢?

从以上程序中可以发现,虽然声明了3个Singleton对象,但实际上所有的对象都值使用 instance 引用,也就是说,不管类外部声明多少对象,最终只有一个实例化对象存在

在设计模式中,这样的设计成为 单例设计模式,无论程序怎么运行,构造方法私有化的类永远只有一个实例化对象存在,也就是说只要将构造方法私有化,就可以控制实例化对象的产生 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值