/**
* @description 单例设计模式 - 饿汉式
*/
public class MyHungrySingleton {
private MyHungrySingleton hungrySingleton;
private MyHungrySingleton() {
//私有构造方法
}
// 新增synchronized影响性能,不加synchronized会出现线程并发问题
// 可参考spring的单例注册源码(SimplePattern和BeanFactory)
// 链接: http://blog.720ui.com/2017/design_pattern_singleton_reg/
public synchronized MyHungrySingleton getInstance() {
if(null == hungrySingleton) {
hungrySingleton = new MyHungrySingleton();
}
return hungrySingleton;
}
}
public class SimplePattern {
private static boolean isInitialFlag = false;
public SimplePattern() {
// 只能保证生成一个实体, 根据业务场景进行考虑是否需要
synchronized (SimplePattern.class) {
if (!isInitialFlag) {
isInitialFlag = !isInitialFlag;
}else {
throw new RuntimeException("单例已被侵犯");
}
}
}
public static SimplePattern getInstance() {
return Holder.hodler;
}
private static class Holder {
private static final SimplePattern hodler = new SimplePattern();
}
}
// Spring中的做法,就是用这种注册式单例
public class BeanFactory {
private static Map<String, Object> ioc = new ConcurrentHashMap<String, Object>();
private BeanFactory() {
}
static {
BeanFactory singletonReg = new BeanFactory();
System.out.println(BeanFactory.class.getName());
ioc.put(singletonReg.getClass().getName(), singletonReg);
}
public static Object getBean(String className) {
if (className == null) {
className = BeanFactory.class.getName();
}
if (!ioc.containsKey(className)) {
Object obj = null;
try {
ioc.put(className, Class.forName(className).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
return obj;
} else {
return ioc.get(className);
}
}
}
/**
* @description 单例设计模式 - 饱汉式
*/
public class MyHungrySingleton {
private MyHungrySingleton hungrySingleton = new MyHungrySingleton();
private MyHungrySingleton() {
//私有构造方法
}
/**
* @description 获取MyHungrySingleton实例
*/
public MyHungrySingleton getInstance() {
return hungrySingleton;
}
}
参考链接: http://blog.720ui.com/2017/design_pattern_singleton_reg/