介绍
在前面文章中提到的策略模式提到过,需要客户自行选择类并创建实例,那么这个选择的过程放在哪里呢,如果在每一个需要此对象的地方都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;
}
}
}
// 调用方法省略
?>
把创建对象的过程封装起来,也方便后期添加更多的方法。