现在的位置: 首页 > 综合 > 正文

JAVA设计模式单例

2018年05月28日 ⁄ 综合 ⁄ 共 1048字 ⁄ 字号 评论关闭

以前就知道单例模式就是只能实例化一个类。没想到中间还这么多说道

从基础说起,第一种就叫做静态创建实例 就是除了将构造函数变为私有的外,有一个内部new 一个实例,static的 然后通过getInstance 返回实例

然后这种方式的缺点在于,如果单例还有其他静态函数,一旦调用的话,就可以创建单例。 封闭性不好

来个封闭性好的, 改一下 内部new一个实例为空, 在getInstance 返回的过程中,判断是否为null ,如果为null 就new 一个Instance 返回。

但是这样多线程并发就要添加同步锁。造成时间开销

再改进一下 利用静态内部类可以访问外部类的私有方法。 在getInstance 的时候 返回静态内部类的外部类实例。当单例类被加载时,其内部类不会被加载,也就不会创建单例对象

但这种也不太好,有一种方法也可以突破限制,比如通过反射改变构造函数的私有性,就可以创建多个单例。

所以据说最好的方法是利用枚举来做单例,复制代码过来吧。

enum Singleton {
RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255);

// 构造枚举值
Singleton(int rv, int gv, int bv) {
this.redValue = rv;
this.greenValue = gv;
this.blueValue = bv;
}

// 自定义数据域,private为了封装。
private int redValue;
private int greenValue;
private int blueValue;

public int getRedValue() {
return redValue;
}

public void setRedValue(int redValue) {
this.redValue = redValue;
}

public int getGreenValue() {
return greenValue;
}

public void setGreenValue(int greenValue) {
this.greenValue = greenValue;
}

public int getBlueValue() {
return blueValue;
}

public void setBlueValue(int blueValue) {
this.blueValue = blueValue;
}
}

public class Demo {
public static void main(String[] args) {
System.out.println(Singleton.RED.getRedValue());
}
}

抱歉!评论已关闭.