文章目录
注:本文一些观点是从网络上学习而来,一些是本人自己的观点,如有建议或意见,欢迎交流。
1 建造者模式
1.1 需求
打豆浆有三步:选原料,搅拌,加热。现在要打红豆豆浆,绿豆豆浆,黑豆豆浆。编写程序,实现这个需求。
1.2 普通设计思路
分析:
把产品和创建产品的过程耦合在了一起,对程序的扩展和维护不好。
1.3 使用建造者模式的设计思路
思路:
将产品和创建产品的过程解耦,使用建造者模式,实现同样的过程创建不同的对象。
四个角色:Product、Builder、ConcreteBuilder、Director
1.4 建造者模式思想在Mybatis中的应用
SqlSessionFactoryBuilder中的build方法使用了建造者模式的思想,尽管代码层面并不是标准的建造者模式。
我认为XMLConfigBuilder也使用了类似建造者模式的设计,类图如下:
2 简单工厂模式
2.1 需求
多种汉堡,包括鳕鱼堡,奥尔良鸡肉堡,牛肉堡。制作流程为选材,做熟,搭配在一起。实现汉堡订购功能。
2.2 普通设计思路
分析:
违背了OCP原则,即对扩展开放,对修改关闭。如果要新增一个种类的汉堡,首先要新增鳕鱼堡类,然后订购汉堡类需要加入对鳕鱼堡类的操作,那么所有的订购汉堡类都需要修改,即创建汉堡的地方往往有多处,因此都需要修改。将创建汉堡的代码封装在一起,即使用简单工厂模式。
2.3 使用简单工厂模式的设计思路
简单工厂模式是由工厂对象决定创建哪一种产品的设计模式。
2.4 简单工厂模式在Mybatis中的应用
DefaultSqlSessionFactory中使用openSessionFromDataSource方法创建出SqlSession对象。
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
3 工厂方法模式
3.1 需求
接上面需求,如果可以买不同口味的汉堡,比如有北京的鳕鱼堡,北京的牛肉堡,天津的狗肉堡等。
3.2 使用简单工厂模式的情形
北京会有一个简单工厂,天津会有一个,最后会有很多简单工厂,工厂过多。解决办法是:定一个创建对象的抽象方法,在子类中具体实现,将对象的实例化推迟到子类,即工厂方法模式。
4 抽象工厂模式
4.1 需求
同上面的需求。
4.2 使用抽象工厂模式设计
将简单工厂模式和工厂方法模式结合起来。
4.3 抽象工厂模式在Mybatis中的应用
5 外观模式
5.1 需求
想要有条理地使一个大系统运转起来,要想使这个系统运转起来,需要多个小系统协同工作才可以。如果使用者直接去对接各个小系统,会很麻烦。可以使用外观模式。提供一个外观界面给使用者,在这个界面后去调度各个小系统,使用者只需要对接这个外观界面,不需要对面繁多的各个小系统。
5.2 使用外观模式的设计思路
外观类:为调用端提供统一的接口,将请求代理给正确的子系统。
客户端:外观类的调用者。
子系统集合:一系列子系统,服务的提供者。