Java学习笔记之构造方法私有化

1、构造方法私有化

类的封装性,不仅体现在对属性的封装,而且可以对方法进行封装,这里的方法当然包括构造方法

class SingleTon{
    private SingleTon(){}  // 构造方法私有化
    public void print(){
        System.out.println("hello world!");
    }
}

public class SingleTonDemo {
    public static void main(String[] args) {
        SingleTon s = null;		// 声明对象
        s = new SingleTon();	// 错误,不能实例化对象
    }
}

SingleTon类的构造方法被私有化,不能在外部进行实例化,只能在内部实例化

class SingleTon{
    SingleTon instance = new SingleTon();  // 在内部产生本类是实例化对象
    private SingleTon(){}  // 构造方法私有化
    public void print(){
        System.out.println("hello world!");
    }
}


public class SingleTonDemo {
    public static void main(String[] args) {
        SingleTon s = null;

    }
}

一个类的构造方法被私有化之后,则只能从其内部获取实例化对象,可以将其声明为static类型,就直接可以用类名去调用。

class SingleTon{
    static SingleTon instance = new SingleTon();  // 在内部产生本类是实例化对象
    private SingleTon(){}  // 构造方法私有化
    public void print(){
        System.out.println("hello world!");
    }
}


public class SingleTonDemo {
    public static void main(String[] args) {
        SingleTon s = null;
        s = SingleTon.instance;	// 获取实例化对象
        s.print();
    }
}

// 运行结果
hello world!

正常情况下,我们还是应该对属性进行封装

class SingleTon{
    private static SingleTon instance = new SingleTon();  // 在内部产生本类是实例化对象
    public static SingleTon getInstance(){ // 通过静态方法获取instance对象
        return instance;
    }
    private SingleTon(){}  // 构造方法私有化
    public void print(){
        System.out.println("hello world!");
    }
}


public class SingleTonDemo {
    public static void main(String[] args) {
        SingleTon s = null;
        s = SingleTon.getInstance();
        s.print();
    }
}

看到这里,我们会有这样的疑问,这个看起来比较麻烦啊,为啥还要这样写呢?为什么不直接实例化对象?
咱们带着这些疑惑再来看这个问题,假如我们产生了三个对象

class SingleTon{
    private static SingleTon instance = new SingleTon();  // 在内部产生本类是实例化对象
    public static SingleTon getInstance(){ // 通过静态方法获取instance对象
        return instance;
    }
    private SingleTon(){}  // 构造方法私有化
    public void print(){
        System.out.println("hello world!");
    }
}


public class SingleTonDemo {
    public static void main(String[] args) {
        SingleTon s1 = null;
        SingleTon s2 = null;
        SingleTon s3 = null;
        s1 = SingleTon.getInstance();
        s2 = SingleTon.getInstance();
        s3 = SingleTon.getInstance();
        s1.print();
        s2.print();
        s3.print();
    }
}

不管外部声明了多少个SingleTon对象,最终结果都是通过getInstance()方法获取到实例化对象,换言之,s1,s2,s3都使用了一个实例化对象的引用:instance

在这里插入图片描述

这种方式称为单态(单例)设计模式:SingleTon
如果不希望一个类产生过多的对象,那么就可以考虑这种设计模式。

2、单例设计模式的意义

2.1 实例控制

单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

2.2 灵活性

因为类控制了实例化过程,所以类可以灵活更改实例化过程。

以windows操作系统的回收站程序为例,每个硬盘都有一个回收站,桌面也有一个,但是实际上每个硬盘的回收站和桌面的是同一个,也就是说整个操作系统其实就只有一个回收站实例,其他地方的都是这个实例的引用而已。

猜你喜欢

转载自blog.csdn.net/zuolixiangfisher/article/details/84502631