设计模式——建造者模式

建造者模式和工厂模式很类似,不过添加了一个导演的角色,导演是创建产品的,它负责利用创造者来组建产品并且返回一个产品,但是导演不和产品又具体关系。导演类总体来说是比较灵活不固定的部门,不像产品和创造者那样固定。

一般建造者模式包含四个角色:

Dirextor: 导演(指挥者)类,用于统一组装流程。

Builder:抽象Builder类,规范产品的组建,一般是由子类实现。

ConcreteBulider: 抽象Builder类的实现类,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象

Product: 产品类。

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

应用实例:1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 

优点:1、建造者独立,易扩展。 2、便于控制细节风险。

缺点:1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景:1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

下边是一个代码示例:

<?php

//产品类,测试数据“程序”
class Program{
	public $DataBase;
	public $Language;
	public function SetDataBase($DataBase)
	{
		$this->DataBase = $DataBase;
	}
	public function SetLanguage($Language)
	{		
		$this->Language = $Language;
	}
	public function ShowInfo()
	{
		echo "DataBase is ".$this->DataBase." and Language is ".$this->Language;
	}
}

//抽象创造者,一般包含创造和返回两个方法,规范产品的组建,一般是由子类实现。
abstract class Builder{
	abstract function CreateProgram($DataBase,$Language); 
	abstract function GetProgram(); 
}

//创造者,真正实现功能的类,并且返回一个组建好的对象
class ConcreteBuilder extends Builder{
	private $Program;
	function __construct()
	{
		$this->Program = new Program();
	}
	public function CreateProgram($DataBase,$Language)
	{
		$this->Program->SetDataBase($DataBase);		
		$this->Program->SetLanguage($Language);
	}
	public function GetProgram()
	{
		return $this->Program;
	}	
}

//导演类,用于统一组装流程
class Director{
	private  $builder;
	function __construct()
	{
		$this->builder = new ConcreteBuilder();
	}
	function GetnewProgram($DataBase,$Language)
	{
		$this->builder->CreateProgram($DataBase,$Language);
		return $this->builder->GetProgram();
	}
}

$Client = new Director();
$Program = $Client->GetnewProgram("Mysql", "PHP");
$Program->ShowInfo();
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值