03-建造(Builder)模式scala实现

Posted 架构设计模式

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03-建造(Builder)模式scala实现相关的知识,希望对你有一定的参考价值。

摘要:本文用一个实例场景描述Gof 23设计模式中的建造模式,并用scala程序代码给予实现,同时也给出实现代码的UML模型。

关键字Gof 23 设计模式 建造模式 scala

Builder Patternbased on scala

Abstract:This paper gives a scene example to describe theuse of Builder Pattern of Gof 23 Design Pattern and achieves the example by scalaat the same time gives the UML model of realization of the example.

Key word: Gof 23  Design Pattern;  Builder Pattern  scala

 

1.标准定义

建造模式标准定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2. 分析和说明

建造模式属于创建性模式,它就是将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。建造模式就是解决这类问题的一种思想方法——将一个复杂对象的构建与它的表示分离.使得同样的构建过程可以创建不同的表示。Builder结构如图1所示。

Builder角色包括抽象建造者(Builder)角色、具体建造者(Concrete Builder)角色、导演者(Director)角色和产品(Product)角色。

1 建造模式结构

抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,以接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法;另一种是结果返还方法。一般来说,产品所包含的部件数目与建造方法的数目相符。换言之,有多少部件,就有多少相应的建造方法。

具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。在建造过程完成后,提供产品的实例。

导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。

产品(Product)角色:产品(Product)便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

3 应用场景举例

比如公司要做一个软件项目,该软件项目由可行性研究、技术交流、投标、签订合同、需求调研、系统设计、系统编码、系统测试、系统部署和实施、系统维护等多个过程组成。但是对于不同的项目,有不同的过程组成。如对于非投标项目ProjectA,只有需求调研、系统设计、系统编码、系统测试、系统部署和实施、系统维护等过程。就可以采用Builder模式。

AbstractProjectProcessBuilder可以理解为抽象建造者(Builder)角色,ConcreteProjectProcessBuilder可以理解为实现抽象建造者(Builder)角色的具体建造者(Concrete Builder)角色。ProjectA可以理解为导演者(Director)角色和产品(Product)角色的结合。其实现类图如图2所示。

2 建造模式的类图

 

4scala的实现程序代码

scala程序实现主要包括AbstractProjectProcessBuilder抽象类,ConcreteProjectProcessBuilder类和ProductA类等3个类。下面分别列出这3个类的程序代码,其实现类图如图2所示。最后列出测试代码并显示输出结果。

程序代码清单01

 

import  scala.collection.mutable.ArrayBuffer

 

abstract class  AbstractProjectProcessBuilder {     

      

       val  processList = ArrayBuffer[String]()

      

       //可行性分析过程

       def  buildFeasibility()

       //技术交流过程

       def  buildTechnicalDiscussion()

       //投标过程

       def  buildBid()

       //需求调研和分析过程

       def  buildRequirement()

       //设计过程

       def  buildDesign()

       //编码过程

       def  buildProgram()

       //测试过程

       def  buildTest()

       //部署和实施过程

       def  buildDeployment()

       //维护过程

       def  buildMaintenance()

      

       def  showProcess():Unit ={         

              for(i  <- 0 to processList.length-1) println( processList(i) + ",")        

       }

}

 

 

class ConcreteProjectProcessBuilder  extends AbstractProjectProcessBuilder{

      

       //可行性分析过程

       def  buildFeasibility():Unit ={

           processList += "可行性分析过程"          

       }

       //技术交流过程

       def  buildTechnicalDiscussion():Unit ={

           processList += "技术交流过程"         

       }

       //投标过程

       def  buildBid():Unit ={

           processList += "投标过程"         

       }

       //需求调研和分析过程

       def  buildRequirement():Unit ={

           processList += "需求调研和分析过程"            

       }

       //设计过程

       def  buildDesign():Unit ={

           processList += "设计过程"               

       }

       //编码过程

       def  buildProgram():Unit = {

           processList += "编码过程

              //processList.add("编码过程");

       }

       //测试过程

       def  buildTest():Unit ={

           processList += "测试过程"               

       }

       //部署和实施过程

       def  buildDeployment():Unit ={

           processList += "部署和实施过程"            

       }

       //维护过程

       def  buildMaintenance():Unit ={

           processList += "维护过程"         

       }

}

 

 

class ProjectA {

      

       var  projectBulider: AbstractProjectProcessBuilder = null   

             

       def  setBuilder( builder: AbstractProjectProcessBuilder  ):Unit = {

              projectBulider  = builder

       }

      

       def  Construct():Unit ={

              projectBulider.buildRequirement();

              projectBulider.buildDesign();

              projectBulider.buildProgram();

              projectBulider.buildTest();

              projectBulider.buildDeployment();

              projectBulider.buildMaintenance();

       }

      

       def  showProcess():Unit ={

              projectBulider.showProcess();

       }

}

 

 

object Client {

      

     def main(args: Array[String]) {    

 

         println ("—————这是builder模式的演示——————" );       

              val  bulider= new ConcreteProjectProcessBuilder();

             

              val  project1 = new ProjectA();

              project1.setBuilder(bulider)

              project1.Construct();

              project1.showProcess();       

    }

}

建造模式测试类输出结果如下所示:

—————这是builder模式的演示——————

需求调研和分析过程

设计过程

编码过程

测试过程

部署和实施过程

维护过程

 

 

 

参考文献

[1] E.Gamma, R.Helm, R.Johnson, andVlissides. Design Patterns Elements of Reusable Object Oriented Software.Addison-Wesley, 1995

[2] E.Gamma, R.Helm, R.Johnson, andVlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.20009

[3] [] Martin Odersky, [] Lex Spoon[] BillVennersScala编程(第3版),北京:电子工业出版社出版. 2017.11  

[4] [] Dean WamplerAlex Payne, Scala程序设计(第2版),北京:人民邮电出版社出版, 2010.8

[5] scala教程 http://www.runoob.com/scala/scala-tutorial.html

 

 


以上是关于03-建造(Builder)模式scala实现的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式(Builder Pattern)

建造者模式-Builder

设计模式之建造者模式

《设计模式》之建造者模式(Builder)

Java设计模式之建造者模式(Builder Pattern)

Java设计模式之建造者模式(Builder Pattern)