// 开发模式之工程模式 // 工厂模式: // 由工厂类根据参数来决定创建出哪一种产品类的实例; // 工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。 // 工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。 // 简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类; //示例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();
最後抽象工廠
定義:為創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類。
類型:創建類別模式
類別圖:
抽象工廠模式與工廠方法模式的區別
抽像模式對象。他與工廠方法模式的差異就在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構。在程式設計中,通常一個產品結構,表現為一個介面或抽象類,也就是說,工廠方法模式提供的所有產品都是衍生自同一個介面或抽象類,而抽象工廠模式所提供的產品則是衍生自不同的介面或抽象類別。
在抽象工廠模式中,有一個產品族的概念:所謂的產品族,是指位於不同產品等級結構中功能相關聯的產品組成的家族。抽象工廠模式所提供的一系列產品就組成一個產品族;而工廠方法提供的一系列產品稱為一個等級結構。我們依然拿生產汽車的例子來說明他們之間的差異。
在上面的類圖中,兩廂車和三廂車稱為兩個不同的等級結構;而2.0排氣量車和2.4排氣量車則稱為兩個不同的產品族。再具體一點,2.0排量兩廂車和2.4排氣量兩廂車屬於同一個等級結構,2.0排量三廂車和2.4排氣量三廂車屬於另一個等級結構;而2.0排量兩廂車和2.0排量三廂車屬於同一個產品族,2.4排氣量兩廂車和2.4排氣量三廂車屬於另一個產品族。
明白了等級結構和產品族的概念,就理解工廠方法模式和抽象工廠模式的區別了,如果工廠的產品全部屬於同一個等級結構,則屬於工廠方法模式;如果工廠的產品來自多個等級結構,則屬於抽象工廠模式。在這個例子中,如果一個工廠模式提供2.0排量兩廂車和2.4排量兩廂車,那麼他屬於工廠方法模式;如果一個工廠模式是提供2.4排量兩廂車和2.4排量三廂車兩個產品,那麼這個工廠模式就是抽象工廠模式,因為他提供的產品是分屬兩個不同的等級結構。當然,如果一個工廠提供全部四種車型的產品,因為產品分屬兩個等級結構,他當然也屬於抽象工廠模式了。
抽象工廠模式的優點
抽象工廠模式除了具有工廠方法模式的優點外,最主要的優點就是可以在類的內部對產品族進行約束。所謂的產品族,一般或多或少的都存在一定的關聯,抽象工廠模式就可以在類別內部對產品族的關聯關係進行定義和描述,而不必專門引入一個新的類別來進行管理。
抽象工廠模式的缺點
產品族的擴充將是一件十分費力的事情,假如產品族中需要增加一個新的產品,則幾乎所有的工廠類都需要進行修改。所以使用抽象工廠模式時,對產品等級結構的劃分是非常重要的。
適用場景
當需要建立的物件是一系列相互關聯或相互依賴的產品族時,便可使用抽象工廠模式。說的更明白一點,就是一個繼承體系中,如果存在著多個等級結構(即存在著多個抽象類別),並且分屬各個等級結構中的實現類別之間存在著一定的關聯或者約束,就可以使用抽象工廠模式。假如各個等級結構中的實現類別之間不存在關聯或約束,則使用多個獨立的工廠來對產品進行創建,則更合適一點。
總結
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
<?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中文网!