单例模式
保证全局仅有一个实例,并为其提供一个全局访问点。
spring中最明显的使用时配置注册bean的时候设置scope为singleton。
源码实现org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if(singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
Map var4 = this.singletonObjects;
synchronized(this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if(singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
if(singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
// 双重判断加锁的懒汉式单例实现!!!
模板模式
定义一个算法骨架,将一些步骤延迟到子类中。模板方法中子类不可以改变算法结构但是可以重新定义算法。
解决的问题:一些方法通用,却在每个子类都重新写了这一方法
Spring中JdbcTemplate就是这种实现,JDBC的步骤是固定的
- 加载驱动
- 建立连接
- 执行SQL语句
- 访问结果记录集ResultSet
- 关闭资源
在这些步骤中第三四步是不固定的,所以留给客户实现,实际使用JdbcTemplate的时候只需要构建SQL就可以了这是典型的模板模式。
@Nullable
public <T> T execute(StatementCallback<T> action) throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Connection con = DataSourceUtils.getConnection(this.obtainDataSource());
Statement stmt = null;
Object var11;
try {
stmt = con.createStatement();
this.applyStatementSettings(stmt);
T result = action.doInStatement(stmt);
this.handleWarnings(stmt);
var11 = result;
} catch (SQLException var9) {
String sql = getSql(action);
JdbcUtils.closeStatement(stmt);
stmt = null;
DataSourceUtils.releaseConnection(con, this.getDataSource());
con = null;
throw this.translateException("StatementCallback", sql, var9);
} finally {
JdbcUtils.closeStatement(stmt);
DataSourceUtils.releaseConnection(con, this.getDataSource());
}
return var11;
}
观察者模式
当对象间存在一对多关系,则使用观察者模式。一个对象修改时会通知其他依赖对象。观察者属于行为模式。
Spring中使用观察者的是事件监听
简单工厂
根据不同的参数返回不同类的实例,很好的分开了创建对象和使用对象的职责。
Spring中的实现是通过getBean方法获取对象的时候根据id或name返回实例。
<bean class="com.taotao.Work" id="work">
<property name="work" value="gongzuo"></property>
</bean>
//org.springframework.context.support.AbstractApplicationContext#getBean(java.lang.String)
public Object getBean(String name) throws BeansException {
this.assertBeanFactoryActive();
return this.getBeanFactory().getBean(name);
}