建造者模式也可以称为生成器模式。builder这个词的本意包括建设者、开发者、创造者的意思。很明显,这个模式是另一种创建模式,用来创建对象。那么它有什么特点呢?从建筑的角度来看,盖房子并不是说马上就能建起来,而是一砖一瓦地盖起来的。房子不仅有砖瓦,还有各种管道,各种电线等等,它们的各个部分共同构成了一个房子。可以说,建造者模式就是这样一个非常形象的由各种组件组成一个对象(房子)的过程。GoF类图及解释GoF定义:将复杂对象的构造与其表示分离,使得同一个构造过程可以创建不同的表示GoF类图代码实现classProduct{private$parts=[];publicfunctionAdd(String$part):void{$this->parts[]=$part;}publicfunctionShow():void{echoPHP_EOL.'产品创建----',PHP_EOL;foreach($this->partsas$part){echo$part,PHP_EOL;}}}产品类,你可以把它想象成我们要盖的房子。这时候房子还没有任何内容,我们需要给它添砖加瓦。interfaceBuilder{publicfunctionBuildPartA():void;公共功能BuildPartB():void;publicfunctionGetResult():Product;}classConcreteBuilder1implementsBuilder{private$product;公共函数__construct(){$this->product=newProduct();}publicfunctionBuildPartA():void{$this->product->Add('部件A');}publicfunctionBuildPartB():void{$this->product->Add('部件B');}publicfunctionGetResult():Product{return$this->product;}}类ConcreteBuilder2实现Builder{private$product;公共函数__construct(){$this->product=newProduct();}publicfunctionBuildPartA():void{$this->product->Add('部件X');}publicfunctionBuildPartB():void{$this->product->Add('部件Y');}publicfunctionGetResult():Product{return$this->product;}}建造不同的开发者总会选择不同的品牌素材进行抽象和实现。这里我们有两个不同的开发者,但是他们的目的是一样的,都是为了盖房子(Product)。ClassDirector{publicfunctionConstruct(Builder$builder){$builder->BuildPartA();$builder->BuildPartB();}}构造函数用于调用构建器进行生产。没错,我们的工程团队。它选择材料并建造。同一个工程团队可以接不同的订单,但他们盖的都是房子。只是这房子的用料和外观不同而已,一般的工艺还是很普通的。$director=newDirector();$b1=newConcreteBuilder1();$b2=newConcreteBuilder2();$director->Construct($b1);$p1=$b1->getResult();$p1->Show();$director->Construct($b2);$p2=$b2->getResult();$p2->Show();最后看看我们的实现,是不是很简单,给工程组准备,准备好一个不一样的builder,然后交给工程组生产!!其实这种模式主要要解决的问题是,一个类可能有很多配置和属性,这些配置和属性不一定都要配置。通过一次性实例化来配置这些东西是非常麻烦的。这时候可以考虑把这些配置和属性做成一个可以随时添加的部分。通过不同的属性组合得到不同的对象。上面这篇文章,GoF中的原文是:Itallowsyoutochangetheinternalrepresentationofaproduct;它将构造代码与表示代码分开;它使您可以更好地控制施工过程。简单来说,对象太复杂了,我们可以一部分一部分的组装起来!稍微懂一点Android开发都不会陌生。在创建对话框对象AlterDialog.builderLaravel时,数据库组件也使用构建器模式。可以查看源码中Database\Eloquent和Database\Query目录下是否有Builder。.php大家都知道手机组装是一??个复杂的过程,所以我们针对不同型号的手机都有相应的图纸(Builder),把图纸和配件交给流水线上的工人(Director),他们就会跟进图纸使用配件制作我们需要的各种型号的手机(Product)。显然,我们都是伟大的建设者,为我们的行业添砖加瓦!!!完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder.php例子前面说了Android中有很多Dialogbox会使用builder模式实现,作为手机厂老板来说,定制安卓系统也是非常重要的一环。就像Xmi,从MIUI开始,我们先是拿下了软件市场,让大家觉得这个系统很好用,然后才开始研发手机。由此可见,软件和硬件确实是现代手机最重要的两个组成部分,缺了它就不行。这次我们就用builder模式来简单实现一组dialog组件吧!对话框类图完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder-dialog.phpattributes[]=$attr;}publicfunctionAddButtons($button){$this->buttons[]=$button;}publicfunctionSetTitle($title){$this->title=$title;}publicfunctionSetContent($content){$this->content=$content;}publicfunctionShowDialog(){echoPHP_EOL,'显示提示框===',PHP_EOL;回声“标题:”。$this->title,PHP_EOL;回声“内容:”。$this->content,PHP_EOL;echo'Style:'.implode(',',$this->attributes),PHP_EOL;echo'Buttons:'.implode(',',$this->buttons),PHP_EOL;}}接口生成器{公共函数BuildAttribute($属性);公共功能BuildButton($button);公共功能BuildTitle($标题);公共功能BuildContent($content);publicfunctionGetDialog();}classDialogBu??ilderimplementsBuilder{private$dialog;公共函数__construct(){$this->dialog=newDialog();}publicfunctionBuildAttribute($attr){$this->dialog->AddAttributes($attr);}publicfunctionBuildButton($button){$this->dialog->AddButtons($button);}publicfunctionBuildTitle($title){$this->dialog->SetTitle($title);}publicfunctionBuildContent($content){$this->dialog->SetContent($content);}publicfunctionGetDialog(){return$this->dialog;}}classDialogDirector{publicfunctionConstruct($title,$content){$builder=newDialogBu??ilder();$builder->BuildAttribute('设置于顶层');$builder->BuildAttribute('居中显示');$builder->BuildButton('确认');$builder->BuildButton('取消');$builder->BuildTitle($title);$builder->BuildContent($content);返回$建设者;}}classModalDialogDirector{publicfunctionConstruct($title,$content){$builder=newDialogBu??ilder();$builder->BuildAttribute('在顶部');$builder->BuildAttribute('居中显示');$builder->BuildAttribute('背景照片');$builder->BuildAttribute('外面不能点击');$builder->BuildButton('确认');$builder->BuildButton('取消');$builder->BuildTitle($标题);$builder->BuildContent($content);返回$建设者;}}$d1=newDialogDirector();$d1->Construct('Window1','AreyousureyouwanttoperformoperationA?')->GetDialog()->ShowDialog();$d2=newModalDialogDirector();$d2->Construct('Window2','您确定要执行操作B吗?')->GetDialog()->ShowDialog();解释这个回到我们的产品有点复杂。title、content、attributes、button等的构造过程其实是一样的,只是这里主要使用不同的构造器普通对话框外面的东西是可以点击的,而模态窗口通常有一个遮罩层,就是背景变成透明黑色,外面的东西就不能再点击了。如果每次class都直接通过构造方法实例化窗口,会传递很多参数,而现在,我们可以通过builder将它们组合起来,让对象具有多态的效果,可以呈现不同的形状和功能。下一期建造者模式真的很常见。虽然在我们平时写的代码中可能用得比较少,但是在很多框架或者大型系统架构中都能找到它的身影。我们希望类简单、小,但是大类的出现总是不可避免的。这时候建造者模式就可以发挥它的作用了,让我们可以轻松的建造出复杂的大型对象。好了,别忘了我们的文章还在继续,喜欢的话请记得关注公众号或者掘金主页,如果怕忘记,不妨写个备忘。各媒体平台均可搜索【硬核项目经理】
