简单工厂模式(Simple Factory Pattern)
在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式包含如下角色:
Factory:工厂角色,工厂角色负责实现创建所有实例的内部逻辑
Product:抽象产品角色,抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
ConcreteProduct:具体产品角色,具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
简单工厂的命名建议:
类命名建议为“模块名称+Factory”,比如,用户模块的工厂就称为UserFactory
方法名称通常为“get+接口名称”或者是“create+接口名称”。比如用户接口名称为UserEbi,那么方法名称通常为getUserEbi或者createUserEbi。
代码实现
1,定义一个接口类
namespace app\lib\people;
interface people{
function getName();
function getAge();
}
2,定义学生工厂类
class StudentFactory implements people{
protected $_name;
protected $_age;
public function __construct($name, $age){
$this->_name = '小明同学';
$this->_age = ''8";
}
public function getName(){
return $this->_name;
}
public function getAge(){
return $this->_age;
}
}
3,定义一个老师工厂类
class TeacherFactory implements people{
protected $_name;
protected $_age;
function __construct(){
$this->_name = '小明老师';
$this->_age = ''28";
}
function getName(){
return $this->_name;
}
function getAge(){
return $this->_age;
}
}
还可以创建多个工厂类,例如清洁工工作类,保安工厂类,校长工厂类等等
4,创建总工厂类,专门用做类的创建
class Factory
{
public static function build($className = null)
{
$className = ucfirst($className);
if ($className && class_exists($className)) {
return new $className();
}
return null;
}
控制器调用工厂方法
//获得老师的名字
echo Factory::build("teacher")->getName(); #输出 小明老师
//获得学生的名字
echo Factory::build("student")->getName(); #输出 小明同学