JAVA设计模式单例

来源:互联网 发布:win10优化知乎 编辑:程序博客网 时间:2024/05/16 04:42

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

从基础说起,第一种就叫做静态创建实例 就是除了将构造函数变为私有的外,有一个内部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());
}
}


0 0
原创粉丝点击