本系列博客是本身在学习设计模式过程当中收集整理的文章集合,其余文章参看设计模式传送门html
建造者模式简介
建造者模式是一种建立型设计模式,这种模式具备很好的封装性。使用建造者模式能够有效的封装变化,在使用建造者模式的场景中,通常产品类和建造者类是比较稳定的,所以,将主要的业务逻辑封装在导演类中对总体而言能够取得比较好的稳定性。sql
在建造者模式中,客户端没必要知道产品内部组成的细节,将产品自己与产品的建立过程解耦,使得相同的建立过程能够建立不一样的产品对象。设计模式
能够更加精细地控制产品的建立过程 。将复杂产品的建立步骤分解在不一样的方法中,使得建立过程更加清晰,也更方便使用程序来控制建立过程。安全
其次,建造者模式很容易进行扩展。若是有新的需求,经过实现一个新的建造者类就能够完成,基本上不用修改以前已经测试经过的代码,所以也就不会对原有功能引入风险。符合开闭原则。微信
建造者模式一般包含如下角色cookie
抽象建造者类(builder):为建立product对象而指定各个组件的抽象接口mybatis
具体建造类(concreteBuilder):实现builder接口,重写方法构建不一样的表示app
产品类(product):具体的产品框架
指挥者类(director):构建一个使用builder接口的对象工具
JDK中的建造者模式——StringBuilder
StringBuilder
类是JDK中比较典型的建造者模式的体现。我先看下这个类的类图:
咱们根据上图看下各个角色的对应状况:
StringBuilder:指挥者角色,持有具体建造者的引用,因为StringBuilder继承了AbstractStringBuilder,这里StringBuilder经过super来做为具体建造者的引用。
AbstractStringBuilder:具体建造者,它实现了appendable接口的append(Character c)方法。
Appendable:抽象建造者,定义了建立对象的接口。
String:产品角色。
另外,StringBuffer也是使用了建造者模式。二者的惟一区别就是StringBuffer使用了synchronized来保证线程安全,而StringBuilder不是线程安全的。
其实,建造者模式在咱们平时开发中更多的体现就是像 StringBuilder.append
这样的链式调用。其中StringBuilder就是指挥官角色,append方法是建立产品细节的过程,当咱们建立完产品后就能够调用toString方法生成具体的产品。好比下面的代码
String str = new StringBuilder().append()
.append()
.toString();
这样相似的代码还有不少,好比
Header header = new HeaderBuilder()
.setClientId(SOAHeader.SOAP_CLIENT_ID)
.setCorrelationId(SOAHeader.SOAP_CORRELATION_ID)
.buildHeader();
在平时开发过程当中,若是咱们看到上面相似的代码,可能就是用了建造者模式。咱们平时要留意这样的代码,看看做者为何要这样设计系统,对咱们的代码提高颇有帮助。这也是我整理总结开发框架中常见设计模式的用意。
Spring中的建造者模式
Spring是Java开发者最经常使用的开发框架。有人说Spring的源代码就是设计模式的盛宴。看Spring的源代码是很好的学习设计模式的一种方式。
在Spring框架中,常涉及到的建造者模式有:
UriComponentsBuilder
BeanDefinitionBuilder
其中 BeanDefinitionBuilder
较底层,咱们平时不太会用到。这里咱们经过 UriComponentsBuilder
来说述Spring中的建造者模式。
下面的代码中,咱们Spring中的restTemplate工具调用远程接口。在调用前须要先构建URL参数。这边就是使用了 UriComponentsBuilder
来构建的。
UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080").
path("/test").build(true);
URI uri = uriComponents.toUri();
RequestEntity<JSONObject> requestEntity = RequestEntity.post(uri).
//添加cookie(这边有个问题,假如咱们要设置cookie的生命周期,做用域等参数咱们要怎么操做)
header(HttpHeaders.COOKIE,"key1=value1").
//添加header
header(("MyRequestHeader", "MyValue")
accept(MediaType.APPLICATION_JSON).
contentType(MediaType.APPLICATION_JSON).
body(requestParam);
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(requestEntity,JSONObject.class);
//响应结果
JSONObject responseEntityBody = responseEntity.getBody();
Spring中的设计模式有不少,咱们平时使用时能够细心关注下。相信确定会有收获。
MyBatis中的建造者模式
MyBatis中最经典的建造者模式确定是获取SqlSessionFactory的过程。
下面是获取SqlSessionFactory的典型用法。
CopyClassPathResource resource = new ClassPathResource("mybatis-config.xml");
InputStream inputStream = resource.getInputStream();
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
经过上面代码发现,建立SqlSessionFactory的代码在SqlSessionFactoryBuilder中,进去一探究竟:
Copy//整个过程就是将配置文件解析成Configration对象,而后建立SqlSessionFactory的过程
//Configuration是SqlSessionFactory的一个内部属性
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
代码比较简单,就不具体分析了。这里仍是对号入座,列举下各个角色。
SqlSessionFactoryBuilder:指挥者角色
BaseBuilder:抽象Builder
XMLConfigBuilder:具体的Builder
SqlSessionFactory:须要被建立的产品
感悟
学习设计模式光学习不行,由于这个东西比较抽象。你必须结合具体的项目框架来看才能有比较深的感悟。
平时若是有空余时间能够本身动手,使用设计模式写一些小的框架。还有就是多看看那些主流开源框架的源代码,这些代码中都有很对设计模式的体现。结合设计模式的理论知识,看看这些框架中为何要用这些模式,比你光看确定收获要多。
声明:发布此文是出于传递更多知识以供交流学习之目的。如有来源标注错误或侵犯了您的合法权益,请做者持权属证实与咱们联系,咱们将及时更正、删除,谢谢。
做者:写代码的木公
来源:https://www.cnblogs.com/54chensongxia/p/12409493.html
More:【微信公众号】 u3dnotes
本文分享自微信公众号 - Unity3D游戏开发精华教程干货(u3dnotes)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。