单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式的要点:
- 某个类只能有一个实例
- 它必须自行创建这个实例
- 它必须自行向整个系统提供这个实例
java基础知识回顾
- 对象是从何而来
- public protected private 关键字的作用范围
- static,final 关键字的作用
第一个问题: 对象从而而来。这个估计学java的都知道,是通过new出来的
public class A{
//
}
如果要等到A的对象,那么必须A a = new A();这样得到A的对象。那么为什么可以这样做呢。因为上述这个A 类的完整形式如下
public class A{
public A(){}//构造方法
}
你得到A的对象a其实是通过这个构造方法得到的,并且这个构造方法是public类型的。所以用new A()就可以得到A的一个对象。
第二个问题: public,protected, private关键字的作用范围
public、protected、private三种显示的修饰符用于控制可见性.
引用
public 对无论任何类都可见
protected只对子类可见
private只对该类可见
试想下如果你将你的构造方法由public 改为private那么会出现什么情况呢
public class A{
private A(){}
}
由于private只对该类可以,因此如果你通过 A a = new A()。这样做不行的。如果你将A的构造函数的访问权限改为private的话,对外就隐藏这个A的对象了。
如果你想得到A的对象a的话,进必须由A自己对外提供,这里有两种方法,一种是利用static关键字,一种是定义个方法这个方法一定不是private,通过这个方法来进行对外提供A的对象。
第三个问题: static,final关键字
static关键字
- 静态方法和静态变量是属于某一个类,而不属于类的对象
- 静态方法和静态变量的引用直接通过类名引用
- 在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以
- 静态变量在某种程序上与其他语言的全局变量相类似,如果不是私有的就可以在类的外部进行访问
final 关键字
final:无法被改变的
- 一个永不改变的编译时常量
- 一个在运行时候被初始化的值,而你不希望它被改变
static和final结合定义表示:一块永远不被改变的存储空间
理解上面三个java的基础知识后,我们看看单例模式怎么出现的
public class A{
priavte statc final A a = new A();
private A(){
}
public static A getInstance(){
return a;
}
}
这个就是实现了一个简单的单例模式。在这个例子中外部想得到A类的通过A提供的getInstace()方法。并且由于a是被static 和final所以就达到单例的效果。
不过单例模式又分为饿汉式和懒汉式。其实主要区别就是A类在初始化A的对象a的时候,