设计模式之单例模式
基本概念
单例模式是一种生产对象型的设计模式。
单例模式指的是某个类的对象在同一时间只允许存在1个实例(对象)。
实现
假设存在类King:
public class King {
}
普通的类可以随意的创建对象:
King k1 = new King();
King k2 = new King();
King k3 = new King();
因为当创建一个类,并且没有显式的指定构造方法时,等效于:
public class King {
public King() {
}
}
要实现单例模式,首先,就必须不允许随意创建对象!则:
public class King {
private King() {
}
}
一旦将构造方法私有化,则在类的外部是不允许调用构造方法的!此时,只有类的内部才可以调用构造方法创建对象:
public class King {
private King king = new King();
private King() {
}
}
在以上代码中,创建的king对象就是唯一被创建出来的对象!那么,当类的外部需要时,提供匹配的get方法即可!
public class King {
private King k = new King();
private King() {
}
public King getInstance() {
return k;
}
}
虽然以上代码看似可行,但是,实际使用时,getInstance()方法是无法被调用的!为了保证在没有King类的对象之前就可以调用getInstance()方法,必须使用static进行修饰:
public class King {
private King k = new King();
private King() {
}
public static King getInstance() {
return k;
}
}
由于被static修饰的成员,只能访问其它static成员(不可以访问其它非static成员),因为一旦使用static后,该成员将会最优先加载到内存中!而其它没有被static修饰的数据此时还没有加载到内存中,所以不可以访问!最终,还需要使用static修饰King的对象:
public class King { private static King k = new King(); private King() { } public static King getInstance() { return k; } }
懒汉式单利模式:
按需求初始化,在需要的时候创建单利对象的实例,好处是如果不适用对象就不占用内存和处理器资源,适用于对象消耗内存大、频率小的情况。
Public final class Boy{
private static Boy instance;
public static synchronized Boy getInstance(){
if(instance==null){
Thread.sleep(1000);
instance = new Boy();
}
return instance;
}
private Boy(){}
}
浙公网安备 33010602011771号