工厂模式,我的理解是为了方便管理同一个类的实例。要创建多个类的实例的时候,每一次实例化都需要new创建,当需要修改类名的时候就很不方便,而工厂模式为此提供了便利,只需要修改一个地方即可同时修改多个实例;同时,可以让子类根据情况创建实例。
代码:
class Factory
{
public static function createTest()
{
return new Test();
}
public static function createKaka()
{
return new Kaka();
}
}
class Test
{
public function index()
{
echo __METHOD__;
}
}
class Kaka
{
public function index()
{
echo __METHOD__;
}
}
// 使用方法
$test = Factory::createTest();
$test->index();
echo "\n";
$kaka = Factory::createKaka();
$kaka->index();
流程图:
==================== 更新 2017-01-19 ======================
这一两天再回看一下,发现上面的代码是硬代码,扩展性差,于是在此修改一下。也不是不知道上面代码的弊端,只是平时养成写维护性好的代码的习惯,写代码都是想到哪就写到哪,考虑的东西比较少,经验不足。以后还需多加练习养成好习惯。下面上代码
代码:
// 改进工厂模式
class Factory
{
protected static $_class = array();
public static function createInstance($class, $params = '')
{
// 此处结合单例模式,避免类的多次实例化,节省系统资源
if( isset(self::$_class[strtolower($class)]) ) {
return self::$_class[strtolower($class)];
}
// 保存实例
self::$_class[strtolower($class)] = empty($params) ? new $class() : new $class($params);
return self::$_class[strtolower($class)];
}
}
// 测试例一
class Test
{
public function __construct($params = 'Test')
{
print_r($params);
}
public function index()
{
echo __METHOD__;
}
}
// 测试例二
class Kaka
{
public function __construct($params = 'Kaka')
{
print_r($params);
}
public function index()
{
echo __METHOD__;
}
}
// 使用方法
$test = Factory::createInstance('Test', 'abc');
$test->index();
echo "\n";
$kaka = Factory::createInstance('Kaka', array('abc'));
$kaka->index();
echo "\n";
$abc = Factory::createInstance('Kaka', array('bcd'));
$abc->index();