介绍
建造者模式(Builder Pattern)使用一个个简单的对象构建出复杂的对象,属于创建型模式。这类模式有两个工作核心,一个负责创建和提供类,另一个负责处理类之间的依赖关系。
处理文件实例
模拟一个需求:通过传入 php 文件和 sh 文件,采用不同的编辑器进行处理,php 使用 phpstorm,sh 使用 notepad ,并记录操作日志,php 使用 word 记录,sh 使用 excel 记录(纯粹学习用,真实业务不这么设计),这时候语言编辑器、日志编辑器、文件处理方式都是独立的产品部件,需要工厂生产出来,组装后才能提供给客户端。
<?php
//定义建造类接口,负责各个子类的建造
interface Builder
{
public function file($file);
public function editor();
public function exec($file);
}
//定义抽象类实现建造类功能,是对具体的类(产品)概括
abstract class ExeFile implements Builder
{
public function file($file)
{
return pathinfo($file, PATHINFO_EXTENSION);
}
public abstract function editor();
public abstract function exec($file);
}
//具体文件类实现
class PhpFile extends ExeFile
{
public function editor()
{
return new Phpstorm();
}
public function exec($file)
{
$editor = $this->editor();
$ext = $this->file($file);
return $editor->handle($ext);
}
}
//具体文件类实现
class ShFile extends ExeFile
{
public function editor()
{
return new Notepad();
}
public function exec($file)
{
$editor = $this->editor();
$ext = $this->file($file);
return $editor->handle($ext);
}
}
//抽象日志编辑工具类
abstract class OfficeFile implements Builder
{
public function file($file)
{
return pathinfo($file, PATHINFO_EXTENSION);
}
public abstract function editor();
public abstract function exec($file);
}
//具体日志编辑工具类实现
class Word extends OfficeFile
{
public function editor()
{
return new Msword();
}
public function exec($file)
{
$editor = $this->editor();
$ext = $this->file($file);
return $editor->handle($ext);
}
}
//具体日志编辑工具类实现
class Excel extends OfficeFile
{
public function editor()
{
return new Msexcel();
}
public function exec($file)
{
$editor = $this->editor();
$ext = $this->file($file);
return $editor->handle($ext);
}
}
//定义文件编辑器类的接口
interface Editor
{
public function handle($ext);
}
//具体编辑器类实现
class Phpstorm implements Editor
{
public function handle($ext)
{
return '当前用Phpstorm操作的是 ' . $ext . ' 可执行文件';
}
}
//具体编辑器类实现
class Notepad implements Editor
{
public function handle($ext)
{
return '当前用Notepad操作的是 ' . $ext . ' 可执行文件';
}
}
//具体编辑器类实现
class Msword implements Editor
{
public function handle($ext)
{
return 'Msword 记录'. $ext .'文件执行过程,并生成LOG';
}
}
//具体编辑器类实现
class Msexcel implements Editor
{
public function handle($ext)
{
return 'Msword 记录'. $ext .'文件执行过程,并生成LOG';
}
}
//导演类,负责组装建造者类生成的产品
class OperaFile
{
public function handlePhpFile($file)
{
$phpFile = new PhpFile();
$editor = $phpFile->editor();
$editor_msg = $editor->handle($file);
$word = new Word();
$log = $word->editor();
$log_msg = $log->handle($file);
return $editor_msg . '<br>' . $log_msg;
}
public function handleShFile($file)
{
$shFile = new ShFile();
$editor = $shFile->editor();
$editor_msg = $editor->handle($file);
$excel = new Excel();
$log = $excel->editor();
$log_msg = $log->handle($file);
return $editor_msg . '<br>' . $log_msg;
}
}
$_file = new OperaFile();
$php_result = $_file->handlePhpFile('demo.php');
$sh_result = $_file->handleShFile('run.sh');
总结
建造者模式通过创建类来完成产品的创建,并由导演类完成产品的组装,和工厂模式相比,建造者模式多了一个导演类,会对产品进行组装然后再提供给客户端。
网友评论