我的Java设计模式——建造者模式

发表于:2017-10-12 10:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Jet啟思    来源:51Testing软件测试网采编

  在未上大学之前,一直有个梦想“Ihaveadream!”,就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女。咳咳~~虽然现在没实现我的dream,但梦想还是得有的。
  说到建造者模式,汽车绝对是典型的列子。汽车本身就是复杂产品对象,其制造过程可以形象的表示建造者模式。
  一、建造者模式
  定义
  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  特点
  1.在某些属性没有赋值之前,复杂对象不能作为一个完整的产品使用。比如汽车包括方向盘、车门、发动机等各部件,缺少了这些部件就不能生产使用。
  2.对象的一些属性必须按照顺序赋值,比如汽车应有车架才能装车轮和其他部件。
  UML
  建造者模式UML图.png
  从上面的UML可以看出,建造者模式涉及到以下四个角色的概念:
  -抽象建造者角色:提供一个接口,规范产品对象的建造,一般由子类实现。一般来说,产品的组成部分数与建造方法数相同,即有多少组成部分,就有多少个建造方法。
  -具体建造者角色:该角色实现了抽象建造者抽象建造者接口,主要是实现所有声明的方法以及返回建造好的产品实例。
  -导演者角色:负责调用具体建造者按照顺序建造产品。导演者只负责调度,真正执行的是具体建造者角色。
  -产品角色:该角色是建造的复杂对象,提供基本方法。
  二、实战
  上代码
  现在要做两辆万众瞩目的豪车,一辆兰博基尼,fine。另一辆法拉利,ok。一起来看看怎么造这两台车...
  产品角色代码如下:
  publicclassProduction{
  privateStringpart1;
  privateStringpart2;
  publicStringgetPart1(){
  returnpart1;
  }
  publicvoidsetPart1(Stringpart1){
  this.part1=part1;
  }
  publicStringgetPart2(){
  returnpart2;
  }
  publicvoidsetPart2(Stringpart2){
  this.part2=part2;
  }
  }
  抽象建造者角色代码如下:
  publicinterfaceIBuilder{
  //产品有多少个组件,就有多少个建造方法
  publicvoidbuildPart1();
  publicvoidbuildPart2();
  //返回产品类
  publicProductionbuild();
  }
  首先来看兰博基尼怎么做,代码如下:
  publicclassBuilderAimplementsIBuilder{
  privateProductionproduction=newProduction();
  @Override
  publicvoidbuildPart1(){
  System.out.println("构造兰博基尼的第一部分。");
  production.setPart1("Thisispart1ofLamborghini");
  }
  @Override
  publicvoidbuildPart2(){
  System.out.println("构造兰博基尼的第二部分。");
  production.setPart2("Thisispart2ofLamborghini");
  }
  @Override
  publicProductionbuild(){
  System.out.println("咔擦!兰博基尼已造好!");
  returnproduction;
  }
  }
  导演者角色调度构建,代码如下:
  publicclassDirector{
  privateIBuilderbuilder;
  publicDirector(IBuilderbuilder){
  this.builder=builder;
  }
  /**
  *构造顺序
  */
  publicProductionconstruct(){
  builder.buildPart1();
  builder.buildPart2();
  returnbuilder.build();
  }
  }
  下面看看客户端如何使用建造者模式把兰博基尼造出来,代码如下:
  publicclassClient{
  publicstaticvoidmain(String[]args){
  //兰博基尼
  IBuilderbuilderA=newBuilderA();
  DirectordirectorA=newDirector(builderA);
  directorA.construct();
  }
  }
  运行客户端代码,结果如下:
  构造兰博基尼的第一部分。
  构造兰博基尼的第二部分。
  咔擦!兰博基尼已造好!
  接下来要造法拉利了,步骤一样,先实现抽象建造者接口。
  法拉利具体建造者代码如下:
  publicclassBuilderBimplementsIBuilder{
  privateProductionproduction=newProduction();
  @Override
  publicvoidbuildPart1(){
  System.out.println("构造法拉利的第一部分。");
  production.setPart1("Thisispart1ofFerrari");
  }
  @Override
  publicvoidbuildPart2(){
  System.out.println("构造法拉利的第二部分。");
  production.setPart2("Thisispart2ofFerrari");
  }
  @Override
  publicProductionbuild(){
  returnproduction;
  }
  }
  客户端建造法拉利代码如下:
  publicclassClient{
  publicstaticvoidmain(String[]args){
  //法拉利
  IBuilderbuilderB=newBuilderB();
  DirectordirectorB=newDirector(builderB);
  directorB.construct();
  }
  }
  客户端运行结果如下:
  构造法拉利的第一部分。
  构造法拉利的第二部分。
  咻咻!法拉利已造好!
  三、建造者模式的优缺点
  优点
  1)降低代码耦合度。在建造者模式中,客户端不需要知道产品内部是如何实现的,我们只需得到产品的对象。并且使用导演者和建造者分离组装过程和组件具体构造过程,具有灵活的扩展性。
  2)优秀的扩展性。具体建造者相互独立,方便扩展,符合开闭原则。
  缺点
  1)一定的使用范围限制。建造者模式的产品的组件基本相同,如果产品的差异性较大,建造者模式就不适用了。
  四、比较
  跟工厂方法模式对比:建造者模式和工厂模式同样是创建一个产品,工厂模式就是一个方法,而建造者模式有多个方法,并且建造者模式是有顺序的执行方法。就是说建造者模式强调的是顺序,而工厂模式没有顺序一说。
  总结
  好了,兰博基尼和法拉利的都拥有了,体验了一会人生赢家的感觉。上一篇工厂方法模式跟建造者模式还是蛮相似的,有兴趣可以翻看,斟酌两种模式的不同之处,这种方式对学习设计模式帮助巨大。
  设计模式Java源码GitHub下载:https://github.com/jetLee92/DesignPattern
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号