在学习java设计模式之前,首先要了解什么是设计模式:设计模式可以看作是巧妙且有深刻见解的解决特定问题的方法。这有点像你的前辈已经从所有角度去解决问题,并且提出了最通用、灵活的方案,这可能是一个你之前看到过并且解决了的问题,但是你的解决方法可能没能比设计模式中的解决方案考虑周全。
首先要了解的是最简单的模式,单例模式。我们下面的例子创建了一个接口,两个java类。
单例模式
Resource.java
interface Resource {
int getValue();
void setValue(int x);
}
Singleton.java
/*
* 由于这不是从Cloneable基类继承而且没有添加可克隆性,
* 因此将其设置为final可防止通过继承添加可克隆性。
* 这也实现了线程安全的延迟初始化:
*/
final class Singleton {
private static final class ResourceImpl implements Resource {
private int i;
private ResourceImpl(int i) {
this.i = i;
}
public synchronized int getValue() {
return i;
}
public synchronized void setValue(int x) {
i = x;
}
}
private static class ResourceHolder {
private static Resource resource = new ResourceImpl(47);
}
public static Resource getResource() {
return ResourceHolder.resource;
}
}
SingletonPattern.java
public class SingletonPattern {
public static void main(String[] args) {
Resource r = Singleton.getResource();
System.out.println(r.getValue());
Resource s2 = Singleton.getResource();
s2.setValue(9);
System.out.println(r.getValue());
try {
// 不能这么做,会发生:compile-time error(编译时错误).
// Singleton s3 = (Singleton)s2.clone();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}
创建单例的核心在于防止客户端程序员直接创建对象,在这里,通过在Singleton类中将Resource的实现作为私有类来实现的。在第一次访问Singleton时,Resource的实现类ResourceImpl被创建,之后再通过getResource()方法来获取对象,只能获得已经创建好的对象。
ps:为了保证线程安全,Singleton中的get和set使用了synchronized修饰。
本文的例子出自《On Java 8》中文版
链接:https://lingcoder.github.io/OnJava8/?hmsr=codercto.com&utm_medium=codercto.com&utm_source=codercto.com#/