工厂模式
工厂模式可以将对象的生产直接从new一个对象,改成调用一个工厂方法.这样的好处是:如果实例化的类名发生了变化,只需要修改工厂方法即可
代码实现简单工厂模式
目录结构
|factor #项目根目录
|--Think #核心类库
|----Loder.php #自动加载类
|----factor.php #工厂类
|----main #核心类
|------DB.php #DB类
|--index.php #单一的入口文件
代码实例
DB类 Think/main/DB.php
<?php
/**
* DB类
*/
namespace Think\main;
class DB{
public function __construct() {
echo __CLASS__.PHP_EOL;
}
}
工厂类 Think/factor.php
<?php
/**
* 工厂类
*/
namespace Think;
use Think\main\DB;
class factor{
//生成对象方法
static function createDB(){
echo '实例化了DB类'.PHP_EOL;
return new DB();
}
}
自动加载类 Think/Loder.php
<?php
namespace Think;
class Loder{
static function autoload($class){
require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
}
}
入口文件 index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
\Think\factor::createDB();
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
下一篇 php设计模式之单例模式