必要のないサブクラスパターンについては、それらを組み合わせて、1つのクラス内の複数のメソッドを通じてファクトリ出力を完成させます
abstract class messageFactor{ abstract function getHeader(); abstract function getMail(); abstract function getMobile(); abstract function getFooter();}class smudgeMo extends messageFactor{ public function getHeader() { return 'Header'; } public function getMail() { return new Mail(); } public function getMobile() { return new Mobile(); } public function getFooter() { return 'Footer'; }}class julylovinMo extends messageFactor{// 和上个子类相似}
サブクラスの継承は削減されますが、プロダクトを追加する場合、カップリングの問題が深刻すぎます。型、抽象関数、およびサブクラスの継承には、対応するメソッドの追加が必要です
abstract class factory{ const APPT = 1; const TTD = 1; const CONTACT = 1; abstract function make($flag_int);}class mailModel extends factory{ public function make($flag_int) { switch ($flag_int){ case self::APPT: return new apptEncoder(); break; case self::TTD: return new ttdEncoder(); break; case self::CONTACT: return new contactEncoder(); break; } }}
コンパクトなファクトリ パターンですが、結合度が高く、メンテナンスにはつながりません
グローバル変数はクラスを特定の環境にバインドし、カプセル化を破棄します
機能:
設定オブジェクトをパラメータとして渡さずに、任意のオブジェクトから呼び出すことができます
設定はグローバル変数に保存すべきではありません
システム内に複数の設定オブジェクトがあってはなりません、つまり、インスタンス化が許可されるのは 1 つだけです
class Preference { static $instance; public $name; private function __construct() { } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public static function getInstance() { if (empty(self::$instance)) // 控制了只有一个Preference实例对象 { self::$instance = new Preference(); } return self::$instance; }}$prf = Preference::getInstance(); // 任何地方可以获取Preference实例对象$prf->setName('Julylovin');echo $prf->getName(); // Julylovin
継承の代わりに組み合わせを使用します。 抽象ファクトリー パターンには並列階層継承があり、結合の問題が発生します。
特定のプロダクト自体をコピーするには、clone キーワードを使用します。
class sea {private $navigability = 0 ; //可航行public function __construct($navigability) { $this->navigability = $navigability; }}class earthsea extends sea{}class plain{}class earthplain extends plain{}class forest{}class earthforest extends forest{}class factory{ private $sea; private $plain; private $forest; public function __construct(sea $sea, plain $plain, forest $forest) { $this->sea = $sea; $this->plain = $plain; $this->forest = $forest; } public function getSea() { return clone $this->sea;// 只是引用对象,是同一个对象,并非两个对象 } public function getPlain() { return clone $this->plain; } public function getForest() { return clone $this->forest; }}$earthInstance = new factory(new earthsea(1), new earthplain(), new earthforest()); //海域可航行$earthInstance->getForest(); // new earthforest() 的实例
合成パターンは、コレクションとコンポーネント間の関係をモデル化するのに役立ちます
射手 (Archer) は軍隊 (Arm) に結合され、複数の砲手は軍隊 (bombardStrength) の戦闘効率を高めることができます
abstract class unit { public function addunit(Unit $unit){ // 阻止独立单元再次添加对象 throw new unitException(get_class($unit).'is a leaf'); } public function removeunit(Unit $unit){ // 阻止独立单元删除添加对象 throw new unitException(get_class($unit).'is a leaf'); } abstract function bombardStrength();}class unitException extends Exception{}class Archer extends unit { public function bombardStrength() { return 4 ; }}class Army extends unit{ //组合模式体 private $units = array(); public function addunit(Unit $unit) { if(in_array($unit, $this->units, true)) { return ; } $this->units[] = $unit; } public function removeunit(Unit $unit) { $units = array(); foreach ($this->units as $item) { if($item !== $unit) { $units[] = $item; } } $this->units = $units; } public function bombardStrength() { $ret = 0 ; foreach ($this->units as $unit) { $ret += $unit->bombardStrength(); } return $ret; }}$SubArmy = new Army();$SubArmy->addunit( new Archer());$SubArmy->addunit( new Archer());echo $SubArmy->bombardStrength(); // 8