以下内容主要来源于《MATLAB面向对象编程》,我只是提供这里用到的代码,原书上的代码是matlab写的大家可以去参考,我这里的这些代码是随手写的没有在编译器里验证,反正大家意会一下就好:
单例模式的目标】单例模式主要用来控制某个类实例出来的对象的数量,通常情况之下单例模式意味着单例类只能实例一个对象。
首先看这样一个简单的类:
public class MyClass(){
private int amountOfPeople ;
public MyClass(){
amountOfPeople = 10 ;
System.out.println("人数="+amountOfPeople) ;
return;
}
}
这个类定义了一个私有字段,然后声明了一个方法打印输出这个字段,但是这个类却无法控制这个类实例对象的数量,因为外部程序可以利用这个类来实例任意多数量的对象。
myClass class1 = new MyClass();
myClass class2 = new MyClass();
myClass class3 = new MyClass();
... ...
现在假如我需要严格控制这个对象所能实例对象的数量(比如说一些多个实例会引入逻辑错误的情况下:如某个数据库只允许某个特定的对象读写),那么我需要怎么做呢?
1】我需要对实例过对象的数量做一个记录,用来判断这个类的对象有没有被实例过
2】如果对象已经存在,则返回上一个已经实例过的对象
根据以上,我们通过在类当中添加一个中间层来实现对可实例化对象的数量进行控制:
public class MyClass(){
private int amountOfPeople ;
private myClass(){
amountOfPeople = 10;
System.out.println("人数="+amountOfPeople);
return;
}
public static MyClass getInstence(){
MyClass myClassFlag ;
if(isEmpty(MyClassFlag)){
myClassFlag = new MyClass ;
}
return myClassFlag ;
}
}
在这段代码中将构造方法myClass设置成了私有化方法,从类的外部无法访问,杜绝了外部调用构造方法实例对象的可能;同时建立了一个公用的中间方法getInstance,用来实例对象,这个中间层是static(静态)的,因此可以直接通过类.方法调用,而不需要先实例对象。而且这个中间层方法只能实例一个对象。这种方法就是单例模式的经典实现方法。
同时应注意,因为子类在实例对象时候必须要访问父类的构造函数,而这个单例类的构造函数又是私有的(不能从外部访问),因此这个单例类是不能被继承的。