首页 » PHP教程 » phpcreate_class技巧_PHP进阶教程设计模式之建造者模式

phpcreate_class技巧_PHP进阶教程设计模式之建造者模式

访客 2024-12-19 0

扫一扫用手机浏览

文章目录 [+]

建造者模式是一步一步创建一个繁芜的工具,它许可用户只通过指定繁芜工具的类型和内容就可以构建它们,用户不须要知道内部的详细构建细节。
建造者模式属于工具创建型模式。

将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品工具,每一个详细建造者都相对独立,而与其他的详细建造者无关,因此可以很方便地更换详细建造者或增加新的详细建造者,符合“开闭原则”,还可以更加风雅地掌握产品的创建过程;其紧张缺陷在于由于建造者模式所创建的产品一样平常具有较多的共同点,其组成部分相似,因此其利用范围受到一定的限定,如果产品的内部变革繁芜,可能会导致须要定义很多详细建造者类来实现这种变革,导致系统变得很弘大。

phpcreate_class技巧_PHP进阶教程设计模式之建造者模式

UML图

phpcreate_class技巧_PHP进阶教程设计模式之建造者模式
(图片来自网络侵删)
该模式中包含的角色及其职责

抽象工厂模式中存在四种角色,分别是:抽象建造者、详细建造者、指挥者、产品角色

抽象建造者:定义一个抽象接口,规范产品各个组成身分的建造(即规范详细建造者的方法实现)。
个中所规范的方法中必须包括建造方法和结果返回方法详细建造者:实现抽象建造者角色所定义的方法。
详细建造者与业务逻辑关联性较大,运用程序终极会通过调用此角色中所实现的建造方法按照业务逻辑创建产品,在建造完成后通过结果返回方法返回建造的产品实例。
一样平常在外部由客户或一个抽象工厂创建。
指挥者:此角色的浸染是调用详细的建造者角色建造产品。
导演者与产品类没有直接关系,与产品类交谈的是详细抽象角色。
产品角色:一个详细的产品工具。

在本文例子表示

紧张办理的问题须要天生的产品工具有繁芜的内部构造,这些产品工具常日包含多个成员属性。
须要天生的产品工具的属性相互依赖,须要指定其天生顺序。
工具的创建过程独立于创建该工具的类。
在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
隔离繁芜工具的创建和利用,并使得相同的创建过程可以创建不同的产品。
代码复用性 & 封装性(将工具构建过程和细节进行封装 & 复用)优缺陷优点客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品工具。
每一个详细建造者都相对独立,而与其他的详细建造者无关,因此可以很方便地更换详细建造者或增加新的详细建造者, 用户利用不同的详细建造者即可得到不同的产品工具 。
可以更加风雅地掌握产品的创建过程 。
将繁芜产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便利用程序来掌握创建过程。
增加新的详细建造者无须修正原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
缺陷建造者模式所创建的产品一样平常具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适宜利用建造者模式,因此其利用范围受到一定的限定。
如果产品的内部变革繁芜,可能会导致须要定义很多详细建造者类来实现这种变革,导致系统变得很弘大。
利用场景套餐组合,例如一个商品套餐,一个公司组成适宜于一个具有较多的零件(属性)的产品(工具)的创建过程。
隔离繁芜工具的创建和利用,并使得相同的创建过程可以创建不同的产品。
示例代码

以组建公司为背景来编写代码,在创建一间公司我们常日按照不同分工来分身分歧的部门,在这里身为公司领导(Director) 并不须要去管理每个部门处理的详细细节,只要跟部门卖力人沟通就好了。

例如组建一个科技公司大概须要的部门:技能部门、发卖部门、人事部门、财务部门

通过建造者模式来创建一家公司,在没有利用建造者模式的时候我们常日利用基本上都是如下:

没有利用建造者模式的代码:

$company = new Company();$company->setTechnology("技能部门");$company->setSales("发卖部门");$company->setPersonnel("人事部门");$company->setFinance("财务部门");

这样的代码看起来没有什么问题,只不过在调用端就须要多写本多代码了,而且如果针对技能部门设置一些哀求或加工,那么所有调用的地方都须要加工,而利用建造者模式都可以在建造者方法进行处理。

BuilderInterface.php

interface BuilderInterface{ public function technology($str):BuilderInterface; public function sales($str):BuilderInterface; public function personnel($str):BuilderInterface; public function finance($str):BuilderInterface; public function get();}

CompanyBuilder.php

class CompanyBuilder implements BuilderInterface{ / @var Company $company / private $company; / CompanyBuilder constructor. / public function __construct() { $this->company = new Company(); return $this; } public function technology($str): BuilderInterface { $this->company->setTechnology($str); return $this; } public function sales($str): BuilderInterface { $this->company->setSales($str); return $this; } public function personnel($str): BuilderInterface { $this->company->setPersonnel($str); return $this; } public function finance($str): BuilderInterface { $this->company->setFinance($str); return $this; } public function get(): Company { return $this->company; }}

Company.php

class Company{ private $technology;//技能 private $sales;//发卖 private $personnel;//人事 private $finance;//财务 / @return mixed / public function getTechnology() { return $this->technology; } / @param mixed $technology / public function setTechnology($technology): void { $this->technology = $technology; } / @return mixed / public function getSales() { return $this->sales; } / @param mixed $sales / public function setSales($sales): void { $this->sales = $sales; } / @return mixed / public function getPersonnel() { return $this->personnel; } / @param mixed $personnel / public function setPersonnel($personnel): void { $this->personnel = $personnel; } / @return mixed / public function getFinance() { return $this->finance; } / @param mixed $finance / public function setFinance($finance): void { $this->finance = $finance; }}

Director.php

class Director{ public function create(BuilderInterface $builder): Company { // 指挥者利用了详细建造者供应的方法创建工具 return $builder->technology("技能部门") ->sales("发卖职员") ->personnel("人事部门") ->finance("招到财务了") ->get(); }}

调用代码:

// 创建指挥者$director = new Director();// 通过指挥者通报一个建造详细工具$company = $director->create(new CompanyBuilder());print_r($company);

输出结果:

Company Object( [technology:Company:private] => 技能部门 [sales:Company:private] => 发卖职员 [personnel:Company:private] => 人事部门 [finance:Company:private] => 招到财务了)省略指挥者的建造者模式

紧张有三个角色:抽象建造者、详细建造者、产品

UML图

Builder.php

interface Builder{ public function watch($brand):Builder; public function phone($brand):Builder;}

Product.php

class Product{ private $watch = "华为腕表"; private $phone = "小米手机"; / @return string / public function getWatch(): string { return $this->watch; } / @param string $watch / public function setWatch(string $watch): void { $this->watch = $watch; } / @return string / public function getPhone(): string { return $this->phone; } / @param string $phone / public function setPhone(string $phone): void { $this->phone = $phone; }}

给套餐设置默认是,默认的腕表是华为的,手机是小米的。

ConcreteBuilder.php

class ConcreteBuilder implements Builder{ private $product; / ConcreteBuilder constructor. / public function __construct() { $this->product = new Product(); } public function watch($brand): Builder { $this->product->setWatch($brand . "腕表"); return $this; } public function phone($brand): Builder { $this->product->setPhone($brand . "手机"); return $this; } public function get() { return $this->product; }}

发卖职员可以通过调用 watch 和 phone 修正套餐里面默认的产品。

调用代码:

$concreteBuilder = new ConcreteBuilder();$concreteBuilder->phone("华为");//把套餐里的小米手机换成华为的print_r($concreteBuilder->get());

输出结果:

Product Object( [watch:Product:private] => 华为腕表 [phone:Product:private] => 华为手机)

这种做法省略了辅导者,直接通过详细建造者实现了搭配修正。

文章看再多不如亲手敲代码,只有自己写过多代码才是吸取精髓。

如果以为文章还不错,请把文章分享给更多的人学习,在文章中创造有误的地方也希望各位指出更正。
现有误的地方也希望各位指出更正。

微信"大众年夜众号:IT不是挨踢

相关文章