建造者模式,也可以叫做生成器模式,builder这个词的原意就包含了建筑者、开发者、创建者的含义。很明显,这个模式又是一个创建型的模式,用来创建对象。那么它的特点是什么呢?从建筑上来说,盖房子不是一下子就马上能把一个房子盖好的,而是通过一砖一瓦搭建出来的。一个房子不仅有砖瓦,还有各种管道,各种电线等等,由它们各个不部分共同组成了一栋房子。可以说,建造者模式就是这样非常形象的由各种部件来组成一个对象(房子)的过程。
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;
publicfunctionBuildPartB():void;
publicfunctionGetResult():Product;
}
classConcreteBuilder1implementsBuilder{
private$product;
publicfunction__construct()
{
$this->product=newProduct();
}
publicfunctionBuildPartA():void
{
$this->product->Add('部件A');
}
publicfunctionBuildPartB():void
{
$this->product->Add('部件B');
}
publicfunctionGetResult():Product
{
return$this->product;
}
}
classConcreteBuilder2implementsBuilder{
private$product;
publicfunction__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),将图纸和配件交给流水线上的工人(Director),他们就会根据图纸使用配件来生产出我们所需要的各种不同型号的手机(Product)。很明显,我们都是伟大的建造者,为我们的产业添砖加瓦!!!
完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder.php
前面说过Android中有很多Dialog对话框都会用建造者模式来实现,作为一家手机厂的老板,定制化的Android系统也是非常重要的一个部分。就像X米一样,从MIUI入手,先拿下了软件市场,让大家觉得这个系统非常好用,然后再开始开发手机。这就说明软硬件的确是现代手机的两大最重要的组成部分,缺了谁都不行。这回,我们就用建造者模式简单的实现一套对话框组件吧!
对话框类图
对话框功能建造者模式版
完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder-dialog.php
<?php
classDialog{
private$attributes=[];
private$buttons=[];
private$title='';
private$content='';
publicfunctionAddAttributes($attr)
{
$this->attributes[]=$attr;
}
publicfunctionAddButtons($button)
{
$this->buttons[]=$button;
}
publicfunctionSetTitle($title)
{
$this->title=$title;
}
publicfunctionSetContent($content)
{
$this->content=$content;
}
publicfunctionShowDialog(){
echoPHP_EOL,'显示提示框===',PHP_EOL;
echo'标题:'.$this->title,PHP_EOL;
echo'内容:'.$this->content,PHP_EOL;
echo'样式:'.implode(',',$this->attributes),PHP_EOL;
echo'按扭:'.implode(',',$this->buttons),PHP_EOL;
}
}
interfaceBuilder{
publicfunctionBuildAttribute($attr);
publicfunctionBuildButton($button);
publicfunctionBuildTitle($title);
publicfunctionBuildContent($content);
publicfunctionGetDialog();
}
classDialogBuilderimplementsBuilder{
private$dialog;
publicfunction__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=newDialogBuilder();
$builder->BuildAttribute('置于顶层');
$builder->BuildAttribute('居中显示');
$builder->BuildButton('确认');
$builder->BuildButton('取消');
$builder->BuildTitle($title);
$builder->BuildContent($content);
return$builder;
}
}
classModalDialogDirector{
publicfunctionConstruct($title,$content){
$builder=newDialogBuilder();
$builder->BuildAttribute('置于顶层');
$builder->BuildAttribute('居中显示');
$builder->BuildAttribute('背景庶照');
$builder->BuildAttribute('外部无法点击');
$builder->BuildButton('确认');
$builder->BuildButton('取消');
$builder->BuildTitle($title);
$builder->BuildContent($content);
return$builder;
}
}
$d1=newDialogDirector();
$d1->Construct('窗口1','确认要执行操作A吗?')->GetDialog()->ShowDialog();
$d2=newModalDialogDirector();
$d2->Construct('窗口2','确认要执行操作B吗?')->GetDialog()->ShowDialog();
说明
建造者模式真的非常常用,虽说我们平常写的代码中可能用得比较少,但在很多框架或者大型系统的架构中都会有它的身影。我们希望类都是简单的,小巧的,但大型类的出现总是不可避免的,这个时候,建造者模式就能发挥它的作用,让我们能够轻松的构建复杂、大型的对象。好吧,不要忘了我们的文章还在继续,如果喜欢的话要记得关注公众号或者掘金主页哦,如果怕忘了,不妨写个备忘录哦。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved