php実装コンストラクタモード


設計モード-phpを用いて構築者モードを実現する【概要】作成型モード構築者モードは、1つの製品の内部イメージと製品の生産プロセスを分離することができ、それによって異なる内部イメージを持つ製品を生成することができる.【構造図】
【メインキャラ】
抽象コンストラクタ(Builder)ロール:製品の各構成要素のコンストラクタ(すなわち、特定のコンストラクタを規範化する方法の実装)を規範化する抽象インタフェースを定義します.ここで、規範化された方法には、コンストラクタ方法と結果リターン方法が含まれている必要があります.
具体的なコンストラクタ(ConcreteBuilder)ロール:抽象コンストラクタロールで定義されたメソッドを実装します.特定のコンストラクタは、ビジネスロジックと関連性が高く、アプリケーションは最終的に、このロールで実装されたコンストラクションメソッドを呼び出してビジネスロジックに従って製品を作成し、コンストラクションが完了した後、結果の戻り方でコンストラクションされた製品インスタンスを返します.一般的に、外部では顧客または抽象的なファクトリによって作成されます.
ディレクタ(Director)ロール:このロールの役割は、特定のコンストラクタロールを呼び出して製品を構築することです.監督者は製品類と直接関係なく、製品類と話をするのは具体的な抽象的な役割である.
プロダクト(Product)ロール:アドバイザの指導の下で構築者によって作成された複雑なオブジェクト
監督者ロールは、クライアントのビジネスロジックを理解し、クライアントが製品を作成する要求を製品コンポーネントの要求に分割し、特定の製品ロールを呼び出して構築操作を実行するクライアントと直接付き合います.クライアントと特定のコンストラクタを分離します.
【メリットとデメリット】
Builderモードの利点:コンストラクタモードは、1つのオブジェクトの実装を関連する「ビジネス」ロジックからよく分離することができ、イベントロジックを変更することなく、追加(または変更)の実装を容易にすることができます.
Builderモードの欠点:コンストラクタインタフェースの変更により、すべての実行クラスが変更されます.
【適用性】
1、生成する製品オブジェクトは複雑な内部構造がある.
2、生成する必要がある製品オブジェクトの属性は互いに依存し、構築者モードは生成順序を強制することができる.
3、オブジェクトの作成中にシステム内の他のオブジェクトに使用されます.これらのオブジェクトは製品オブジェクトの作成中に入手しにくいです.
【コンストラクタモードphp例】
<?php
 /**
 *      
 * -------------
 * @author 		zhaoxuejie <[email protected]>
 * @package 	design pattern 
 * @version 	v1.0 2011-12-14
 */

//product
class Person {
	private $head;
	private $body;
	private $foot;
	
	// 
	public function getHead(){
		return $this->head;
	}
	
	public function setHead($head){
		$this->head = $head;
	}
	
	// 
	public function getBody(){
		return $this->body;
	}
	
	public function setBody($body){
		$this->body = $body;
	}
	
	// 
	public function getFoot(){
		return $this->foot;
	}
	
	public function setFoot($foot){
		$this->foot = $foot;
	}
}

//    product             
interface PersonBuilder {
	
	public function buildHead();
	public function buildBody();
	public function buildFoot();
	public function getResult();//      
}

//    
class ConcreteBuilder implements PersonBuilder {
	private $person;
	
	function __construct(){
		$this->person = new Person();	
	}
	
	function buildHead(){
		$this->person->setHead('   ……');
	}
	
	function buildBody(){
		$this->person->setBody('    ……');
	}
	
	function buildFoot(){
		$this->person->setFoot('   ……');
	}
	
	function getResult(){
		return $this->person;
	}	
}

//   
class Director {
	
	public function __construct(ConcreteBuilder $builder){
		$builder->buildHead();
		$builder->buildBody();
		$builder->buildFoot();
	}
}

//   
class Client {
	
	public static function main(){
		$builder = new ConcreteBuilder();
		$director = new Director($builder);
		$person = $builder->getResult();
		echo $person->getHead();
		echo $person->getBody();
		echo $person->getFoot();
	}
}

Client::main();

?>