php-工厂模式
概述
工厂模式(Factory Pattern):在工厂模式中,可以根据参数的不同返回不同类的实例。工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
模式结构
工厂模式包含如下角色:
- Factory-工厂角色:工厂角色负责实现创建所有实例的内部逻辑
- Product:抽象产品角色:产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
- ConcreteProduct-具体产品角色:具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
代码实例
<?php
abstract class Product
{
protected $product_name = "";
public function __construct($product_name)
{
$this->product_name = $product_name;
}
protected abstract function getResult();
}
class ConcreteProductA extends Product
{
public function getResult()
{
return "this is Product".$this->product_name;
}
}
class ConcreteProductB extends Product
{
public function getResult()
{
return "this is Product".$this->product_name;
}
}
class ConcreteProductC extends Product
{
public function getResult()
{
return "this is Product".$this->product_name;
}
}
class ConcreteProduct
{
private static $obj;
public static function createProduct($product)
{
switch ($product) {
case 'A':
self::$obj = new ConcreteProductA($product);
break;
case 'B':
self::$obj = new ConcreteProductB($product);
break;
case 'C':
self::$obj = new ConcreteProductC($product);
break;
default:
echo "未定义产品类型";
break;
}
return self::$obj;
}
}
$obj = ConcreteProduct::createProduct('B');
echo $obj->getResult();
模式分析
- 将对象的创建和对象业务逻辑处理分离可以降低代码的耦合度,使得两者修改起来相对容易。
- 工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
- 工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
|