Java 设计模式-模板方法模式(Template Method)
Java 设计模式-简单工厂(Simple Factory)
Java 设计模式-工厂方法(Factory Method)
Java 设计模式-策略模式(Strategy Pattern)
Java 设计模式-命令模式(Command Pattern)
什么是单例模式?
单例模式就是某个类只有唯一一个实例。
单例模式的意图
单例模式的意图是为了确保一个类有且仅有一个实例,并且为它提供一个全局的访问点
单例模式的要点
- 一个类只有一个实例
- 类必须自行创建这个实例
- 类自行向系统提供实例
常见的单例实现方式
- 饿汉模式
/**
* 饿汉单例模式
* @author zhanfgwei
* @version $Id: HungrySingleton.java, v 0.1 2014年9月20日 下午10:17:11 Lenovo Exp $
*/
public class EagerSingleton {
/***初始化一个实例**/
private static final EagerSingleton instance = new EagerSingleton();
/**
* 私有化的构造方法
*/
private EagerSingleton() {
super();
}
/**
* 静态工厂方法获取实例
*
* @return
*/
public static EagerSingleton getInstance() {
return instance;
}
}
- 懒汉模式-线程安全
/**
*
* @author zhangwei
* @version $Id: SafeLazySingleton.java, v 0.1 2014年9月20日 下午10:25:04 Lenovo Exp $
*/
public class SafeLazySingleton {
/**
* 实例属性
*/
private static SafeLazySingleton instance = null;
/**
* 私有化构造方法
*/
private SafeLazySingleton() {
}
/**
*同步的静态工厂方法
*
* @return
*/
synchronized public static SafeLazySingleton getInstance() {
if (instance == null) {
instance = new SafeLazySingleton();
}
return instance;
}
}
- 内部类方式
/**
*
* @author zhangwei
* @version $Id: InnerSingleton.java, v 0.1 2014年9月20日 下午11:11:26 Lenovo Exp $
*/
public class InnerSingleton {
/**
* 私有化的构造方法
*/
private InnerSingleton() {
}
/**
* 静态内部类,持有实例
*
* @author zhangwei
* @version $Id: InnerSingleton.java, v 0.1 2014年9月20日 下午11:22:35 Lenovo Exp $
*/
private static class InstanceHolder {
static InnerSingleton instance = new InnerSingleton();
}
/**
* 静态工厂方法,
*
* @return
*/
public static InnerSingleton getInstance() {
return InstanceHolder.instance;
}
}
- 登记式
/**
*
* @author zhangwei
* @version $Id: RegisterSingletone.java, v 0.1 2014年9月20日 下午10:27:12 Lenovo Exp $
*/
public class RegisterSingleton {
private static Map<String, RegisterSingleton> registers = new ConcurrentHashMap<String, RegisterSingleton>();
static {
registers.put(RegisterSingleton.class.getName(), new RegisterSingleton());
}
private RegisterSingleton() {
}
public static RegisterSingleton getInstance(String name) {
if (name == null) {
name = RegisterSingleton.class.getName();
}
if (registers.get(name) == null) {
try {
registers.put(name, (RegisterSingleton) Class.forName(name).newInstance());
} catch (Exception e) {
LoggerUtils.error("异常");
}
}
return registers.get(name);
}
}