前言
本文介绍设计模式中的单例模式的思维过程。设计模式是一种思想,在各种编程语言的编程中都可以使用,比如java,C#。这里只是以java语言为例。顾名思义,单例模式在java中的意思就是不管程序怎么运行,都只会有一个对象。比如对类Student使用了单例模式,那么,不管在其他的类中怎么使用Student类的对象,都应该是同一个。下面,就顺着这个思路,来探讨怎么在java中使用单例模式。
一、思维过程
1.1、构造方法私有化
既然目标是整个程序中只能创建一个对象,那么在其他类中任意创建对象的这种行为肯定是不允许的。比如想要将Student类设定成单例模式,那么下面这种情况肯定不允许:
class Test{ Student s1 = new Student(); Student s2 = new Student(); } class Student { }
很明显,上面给了其他类创建Student对象的机会,那么就会产生无数个对象。所以想要创建单例模式,第一件事就是不能给别的类new自己的机会。要做到这一点很简单,只要将自己的构造方法声明成private的即可,这样,当别的类想要new自己的时候,会报错,情况如下图所示:
1.2、自己new自己
通过构造方法私有化,现在外部类不能new自己了,但是目标是单例,也就是只能创建一个对象,现在外面一个对象都创建不了了,所以此时我们只能自己(本文中就是指Student类)来创建自己,代码如下所示:
class Student { Student s = new Student(); private Student() { } }
1.3、提供方法给外部使用
通过1.2中的操作,现在可以创建出Studnet类的对象了,且只会创建一个(因为只会new一次),也就达到了单例的要求。但是要想给外部使用,还需要提供一个方法(就像提供get方法给外部访问自己私有成员变量的机会一样),将自己创建的对象返回回去。既然要给外部调用,那么这个方法就应该是public的。
代码如下所示:
class Student { Student s = new Student(); private Student() { } public Student getInstance() { return s; } }
但是,现在外部还是使用不了getInstance()方法,因为getInstance()方法需要Student类的对象才能调用,但是外部现在创建不了 Studnet类的对象,所以现在要做的就是将该方法改为static的,另外,既然方法变为了staitc的,那么其中使用的变量也应该变成static的,代码如下所示:
class Student { private static Student s = new Student(); private Student() { } public static Student getInstance() { return s; } }
1.4、小结
通过上面三步,现在外部想要创建Studnet类的对象,就只能通过调用Student类的静态方法getInstance(),getInstance()方法返回的又是只会创建一次的Student类对象,这样,就实现了单例模式。
单例模式创建的三部曲:
1.构造方法私有化
2.自己创建自己的对象
3.提供static的方法返回自己创建的对象
二、测试
代码:
获取两个Studnet类的对象,如果是单例,那么这两对象s1、s2的地址应该是相等的,也就是输出结果是true,否则是false;
public class Test{ public static void main(String[] args) { Student s1 = Student.getInstance(); Student s2 = Student.getInstance(); System.out.println(s1==s2); } } class Student { private static Student s = new Student(); private Student() { } public static Student getInstance() { return s; } }
输出结果:
附
本文介绍的是单例模式的思维方式,在单例模式2中介绍单例模式的几种实现方式(也在设计模式分类中)。
链接:http://www.cnblogs.com/Bingfengwangzuo/p/6851452.html