PHP面向对象编程设计模式(三)工厂模式

时间:2022-10-12 19:35:11

介绍

  在前面文章中提到的策略模式提到过,需要客户自行选择类并创建实例,那么这个选择的过程放在哪里呢,如果在每一个需要此对象的地方都new一个,那必然会有代码重复,而且如果修改也会很麻烦,这样不符合面向对象的封装原则。所以,工厂模式出现了。
  由工厂类根据参数来决定创建出哪一种产品类的实例;
工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。
简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类;

实现方法

  一个工厂类拥有一个静态的方法,用来接受一些输入,并根据输入决定该创建哪个类的实例。

例子

<?php
/**
* 基类,也可以写成接口
*/

abstract class User
{

protected $name = NULL;

function __construct($name)
{

$this->name = $name;
}

function getName(){
return $this->name;
}

function hasReadPermission(){
return true;
}

function hasModifyPermission(){
return true;
}

function hasDeletePermission(){
return false;
}

function wantsFlashInterface(){
return true;
}
}

/**
* 客户类
*/

class GuestUser extends User
{


}

/**
* 顾客子类
*/

class CustomerUser extends User
{


function hasModifyPermission(){
return true;
}
}

/**
* 管理员子类
*/

class AdminUser extends User
{

function hasModifyPermission(){
return true;
}

function hasDeletePermission(){
return true;
}

function wantsFlashInterface(){
return false;
}

}
/**
* 工厂类
*/

class UserFactory
{

private static $users = array('Andi' => "admin", 'Stig' =>"guest", 'Der'=>"customer");

static function Create($name){
if(!isset(self::$users[$name])){
// 用户不存在
}
switch (self::$users[$name]) {
case 'guest':
return new GuestUser($name);
break;

case 'admin':
return new AdminUser($name);
break;
case 'customer':
return new CustomerUser($name);
break;
default:
// 错误
break;
}
}
}

// 调用方法省略
?>

把创建对象的过程封装起来,也方便后期添加更多的方法。