首页 > 编程 > PHP > 正文

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

2019-11-06 07:07:25
字体:
来源:转载
供稿:网友

介绍

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

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表