// 开发模式之工程模式
// 工厂模式:
// 由工厂类根据参数来决定创建出哪一种产品类的实例;
// 工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。
// 工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。
// 简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类;
//示例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 开发模式之工厂模式。