Java中的私有构造方法和单例模式

私有构造方法

  这几天在学习Netty写聊天室的时候看见了一个例子,在例子中的代码使用到了Java的单例模式,基础不是太好,所以特意去搜索了解了一下单例模式。

本文参考于 构造方法私有化和单例模式

  写单例模式之前先说一下私有构造方法,即在构造方法之前加上private关键字

1
2
3
4
5
public class Test{
private Test(){

}
}

  这时我们定义了构造方法的私有化,如果我们在别的类中实例化Test则会报错,因为私有的方法在其他类中是无法看见的

1
2
3
4
5
public class Test1{
public static void main(String[] args){
Test test=new Test();
}
}

  这时候会报错,因为Test1访问不到Test的私有构造方法

如何去解决呢?

  解决的方法也简单,因为是私有的构造方法,所以我们可以通过在本类里实例化Test,将Test的实例设置为私有静态变量,再构造这个实例的get方法,那么其他类就可以通过这个类的静态方法getInstance()方法获取要获取的类的实例了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test(){
private Test(){

}
//创建静态对象instance
private static Test instance=new Test();
//通过get方法获取instance实例
public static Test getInstance(){
return instance;
}
public void print(){
System.out.println("Hello!");
}
}

public class Test1{
public static void mian(){
//通过调用Test的静态方法获取实例
Test test=Test.getInstance();
test.print();
}
}

  代码运行结果就是Hello!

为什么要这么做呢

  我们先把上面的Test1的代码改一下

1
2
3
4
5
6
7
8
9
10
11
public class Test1{
public static void mian(){
//通过调用Test的静态方法获取实例
Test test=Test.getInstance();
Test test1=Test.getInstance();
Test test2=Test.getInstance();
Test test3=Test.getInstance();
//后面一些实例调用print方法就不一一列出来了....
test.print();
}
}

  这时候我们实例化了四个Test,我们再回头看看刚刚Test的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test(){
private Test(){

}
//创建静态对象instance
private static Test instance=new Test();
//通过get方法获取instance实例
public static Test getInstance(){
return instance;
}
public void print(){
System.out.println("Hello!");
}
}

  我们所有实例化都是通过getInstance方法获取的,但是getInstance方法获取的都是一个instance对象,也就是说我们实例化了那么多Test也只是对instance这个对象的引用。所以如果现在不希望一个类产生过多的对象的话,则必须采用单例设计模式,而且,在以后的java学习中,在支持java的类库中,大量采用了这种模式。

如何理解

  在window中有一个回收站,除了桌面有回收站,每个硬盘都有回收站,实际上每个硬盘上的回收站和桌面的回收站是同一个,
也就是说,整个操作系统只有一个回收站实例,各个地方只是引用这个实例而已。

总结

单例设计模式核心就是将类的构造方法私有化,之后在类的内部产生实例化对象,并通过类名引用类的静态方法(static)返回实例化对象的引用。

-------------本文结束感谢阅读-------------