// 开发模式之工程模式 // 工厂模式: // 由工厂类根据参数来决定创建出哪一种产品类的实例; // 工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。 // 工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。 // 简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类; //示例1 最基本的工厂模式 class Myname{ public function OutPutMyName(){ return 'name is rongyouyuan!~'; } } class NameFactory{ public static function Namefunc(){ return new Myname(); } } $obj=NameFactory::Namefunc(); echo $obj->OutPutMyName(); ?>
上記は最も単純なファクトリ パターンです。以下はファクトリ パターンを使用して単純な計算機を実装します
<?php //定义一个抽象类 abstract class operation { protected $_numA = 0; protected $_numB = 0; protected $_result = 0; public function __construct($a, $b) { $this->_numA = $a; $this->_numB = $b; } //抽象方法所有子类必须实现该方法 protected abstract function getResult(); } //加法运算 class operationAdd extends operation { public function getResult() { $this->_result = $this->_numA + $this->_numB; return $this->_result; } } //减法运算 class operationSub extends operation { public function getResult() { $this->_result = $this->_numA - $this->_numB; return $this->_result; } } //乘法运算 class operationMul extends operation { public function getResult() { $this->_result = $this->_numA * $this->_numB; return $this->_result; } } //除法运算 class operationDiv extends operation { public function getResult() { $this->_result = $this->_numA / $this->_numB; return $this->_result; } } //定义工厂类 class operationFactory { //创建保存示例的静态成员变量 private static $obj; //创建实例的静态方法 public static function CreateOperation($type, $a, $b) { switch ($type) { case '+': self::$obj = new operationAdd($a, $b); break; case '-': self::$obj = new operationSub($a, $b); break; case '*': self::$obj = new operationMul($a, $b); break; case '/': self::$obj = new operationDiv($a, $b); break; } //最后返回这个实例 return self::$obj; } } //最后我们使用工厂模式 $obj = operationFactory::CreateOperation('+', 100, 20); echo $obj->getResult();
最後に、抽象ファクトリ
定義: Concrete クラスを指定せずに、関連するオブジェクトまたは相互依存するオブジェクトのセットを作成するためのインターフェイスを提供します。
タイプ: クラスパターンの作成
クラス図:
抽象ファクトリパターンとファクトリメソッドパターンの違い
using using using 関連または相互依存するオブジェクトのセットを作成するために使用します。ファクトリ メソッド パターンとの違いは、ファクトリ メソッド パターンが製品階層構造をターゲットとするのに対し、抽象ファクトリ パターンは複数の製品階層構造をターゲットとすることです。プログラミングでは、通常、製品構造はインターフェイスまたは抽象クラスによって表されます。つまり、ファクトリ メソッド パターンによって提供されるすべての製品は同じインターフェイスまたは抽象クラスから派生しますが、抽象ファクトリ パターンによって提供される製品は派生します。さまざまなインターフェイスまたは抽象クラスから。
抽象的なファクトリーパターンには、製品ファミリーの概念があります。いわゆる製品ファミリーとは、異なる製品階層構造に位置する、機能的に関連する製品のファミリーを指します。抽象ファクトリ パターンによって提供される一連の製品は製品ファミリーを形成しますが、ファクトリ メソッドによって提供される一連の製品は階層構造と呼ばれます。両者の違いを説明するために、私たちは今でも自動車生産の例を使用しています。
上記のクラス図では、ハッチバックとセダンは 2 つの異なる階層構造と呼ばれ、排気量 2.0 の車と 2.4 の車は 2 つの異なる製品ファミリーと呼ばれます。具体的には、排気量 2.0 のハッチバックと排気量 2.4 のハッチバックは同じ階層構造に属し、排気量 2.0 のセダンと排気量 2.4 のセダンは別の階層構造に属し、排気量 2.0 のハッチバックと排気量 2.0 セダンは別の階層に属します。構造; セダンは同じ製品ファミリーに属し、2.4 排気量ハッチバックと 2.4 排気量セダンは別の製品ファミリーに属します。
ファクトリメソッドパターンと抽象ファクトリーパターンの違いが理解できます。ファクトリはすべて同じ階層構造に属し、ファクトリの製品が複数のレベルにある場合はファクトリ メソッド パターンに属します。構造は、抽象ファクトリー パターンに属します。この例では、工場モデルが排気量 2.0 のハッチバックと排気量 2.4 のハッチバックを提供する場合は、工場モデルが 2 つの製品 (排気量 2.4 のハッチバックと排気量 2.4 のセダン) を提供する場合、この工場モデルに属します。は抽象ファクトリー パターンです。これは、提供される製品が 2 つの異なる階層構造に属しているためです。もちろん、工場が 4 つのモデルすべてに製品を提供する場合、製品は 2 つの階層構造に属しているため、必ず抽象工場モデルにも属します。
抽象ファクトリ パターンの利点
ファクトリ メソッド パターンの利点に加えて、抽象ファクトリ パターンの主な利点は、クラス内のプロダクト ファミリを制約できることです。いわゆる製品ファミリーには、一般的に多かれ少なかれ特定の関係があります。抽象ファクトリー パターンは、管理用の新しいクラスを導入することなく、クラス内の製品ファミリーの関係を定義および記述できます。
抽象ファクトリー パターンの欠点
製品ファミリーの拡張は、非常に骨の折れる作業になります。新しい製品を製品ファミリーに追加する必要がある場合、ほぼすべてのファクトリー クラスを変更する必要があります。したがって、抽象ファクトリー パターンを使用する場合は、製品階層を分割することが非常に重要です。 hersherselfself自身、彼女自身が彼女自身が彼女がシェンシェンシェンシェンシェンシェンシェンシェンシェンシェンは彼女が作成する必要がある。より明確に言うと、継承システムでは、複数の階層構造があり (つまり、複数の抽象クラスがあり)、各階層構造に属する実装クラス間に特定の関連付けまたは制約がある場合、抽象的な工場のパターン。各階層構造内の実装クラス間に関係や制約がない場合は、複数の独立したファクトリーを使用して製品を作成する方が適切です。
概要
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
<?php /** * 抽象工厂模式 * ------------- * @author zhaoxuejie <zxj198468@gmail.com> * @package design pattern * @version v1.0 2011-12-14 */ //--------------------------------------------------------------------------- // 抽象工厂(AbstractFactory)角色:它声明一个创建抽象产品对象的接口。 // 通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。 //--------------------------------------------------------------------------- // 具体工厂(ConcreteFactory)角色:实现创建产品对象的操作。 // 客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。 //--------------------------------------------------------------------------- // 抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。 //--------------------------------------------------------------------------- // 具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。 // 其内部包含了应用程序的业务逻辑。 //--------------------------------------------------------------------------- ///抽象工厂 interface AnimalFactory{ public function createCat(); public function createDog(); } //黑色动物具体工厂 class BlackAnimalFactory implements AnimalFactory{ function createCat(){ return new BlackCat(); } function createDog(){ return new BlackDog(); } } //白色动物具体工厂 class WhiteAnimalFactory implements AnimalFactory{ function createCat(){ return new WhiteCat(); } function createDog(){ return new WhiteDog(); } } //抽象产品 interface Cat{ function Voice(); } interface Dog{ function Voice(); } //具体产品 class BlackCat implements Cat { function Voice(){ echo '黑猫喵喵……'; } } class WhiteCat implements Cat { function Voice(){ echo '白猫喵喵……'; } } class BlackDog implements Dog { function Voice(){ echo '黑狗汪汪……'; } } class WhiteDog implements Dog { function Voice(){ echo '白狗汪汪……'; } } //客户端 class CLient{ public static function main(){ self::run(new BlackAnimalFactory()); self::run(new WhiteAnimalFactory()); } public static function run(AnimalFactory $AnimalFactory){ $cat=$AnimalFactory->createCat(); $cat->Voice(); $dog=$AnimalFactory->createDog(); $dog->Voice(); } } CLient::main();
更多php 开发模式之工厂模式相关文章请关注PHP中文网!