- 设计原则
1、封装变化
2、多用组合,少用继承
3、针对接口编程,不针对现实编程
4、为交互对象之间的耦合设计而努力
5、类应该对扩展开放,对修改关闭
6、依赖抽象,不要依赖具体类
- 单件模式
单件模式 —— 确保一个类只有一个实例,并提供全局访问点
代码实现
/**
* 懒汉式
* 线程安全
* @author WangChunhe
*
*/
public class Singleton {
private static Singleton uniqueInstance;
private Singleton(){};
/**
* 通过添加 synchrogazed关键字到getInstance方法中,
* 迫使每个线程在进入这个方法之前,要等候别的线程离开该方法
* 换句话说,不会有两个线程可以同时进入这个方法
* @return
*/
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance ;
}
}
/**
* 饿汉式
* @author WangChunhe
*
*/
public class Singleton {
/**
* 在静态初始化器中创建单件,这段代码保证了线程安全
*/
private static Singleton uniqueInstance = new Singleton();
private Singleton(){};
/**
* 已经有实例了,就直接返回该实例
* @return
*/
public static Singleton getInstance() {
return uniqueInstance ;
}
}
/**
* 用“双重检查加锁”
*
* 注意:“双重检查加锁”不知用于1.4及更早的Java,
* 因为在1.4及更早版本的Java中,许多JVM对于volatile关键字的实现会导致双重检查加锁的失效
* @author WangChunhe
*
*/
public class Singleton {
/**
* volatile 关键字确保:当uniqueInstance变量被初始化成Singleton实例时,
* 多个线程正确的处理uniqueInstance
*/
private volatile static Singleton uniqueInstance ;
private Singleton(){};
/**
* 检查实例,如果不存在,就进入同步区块
* @return
*/
public static Singleton getInstance() {
//只有第一次才彻底执行这里的代码
if (uniqueInstance == null) {
synchronized (Singleton.class) {
//进入区块后,在检查一次。如果仍是null, 才创建实例
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance ;
}
}