段代码要简单得多。它仅有一个接口
IUser
和一个实现此接口的
User
类。
User
类有两个创建对象的静态方法。此关系可用图 2 中的 UML 表示。
图 2. IUser 接口和带有工厂方法的 user 类 在命令行中运行脚本产生的结果与清单 1 的结果相同,如下所示:
如上所述,有时此类模式在规模较小的环境中似乎有些大材小用。不过,最好还是学习这种扎实的编码形式,以便应用于任意规模的项目中。
单元素模式
某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。
单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。清单 3 中的代码显示了 PHP V5 中的一个数据库连接单元素。
清单 3. Singleton.php<?php require_once("DB.php");
class DatabaseConnection { public static function get() { static $db = null; if ( $db == null ) $db = new DatabaseConnection(); return $db; }
private
常见的PHP五种设计模式小结_网学
浏览:
handle = null;
private function __construct() { $dsn = ''mysql://root:password@localhost/photos''; $this->_handle =& DB::Connect( $dsn, array() ); }
public function handle() { return $this->_handle; } }
print( "Handle = ".DatabaseConnection::get()->handle()."\n" ); print( "Handle = ".DatabaseConnection::get()->handle()."\n" ); ?>
|
此代码显示名为 DatabaseConnection
的单个类。您不能创建自已的 DatabaseConnection
,因为构造函数是专用的。但使用静态 get
方法,您可以获得且仅获得一个 DatabaseConnection
对象。此代码的 UML 如图 3 所示。
图 3. 数据库连接单元素 在两次调用间,handle
方法返回的数据库句柄是相同的,这就是最好的证明。您可以在命令行中运行代码来观察这一点。
% php singleton.php Handle = Object id #3 Handle = Object id #3 %
|
返回的两个句柄是同一对象。如果您在整个应用程序中使用数据库连接单元素,那么就可以在任何地方重用同一句柄。
您可以使用全局变量存储数据库句柄,但是,该方法仅适用于较小的应用程序。在较大的应用程序中,应避免使用全局变量,并使用对象和方法访问资源。
观察者模式
观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。
一个简单示例是系统中的用户列表。清单 4 中的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。
清单 4. Observer.php<?php interface IObserver { function onChanged( $sender, $args ); }
interface IObservable { function addObserver( $observer ); }
class UserList implements IObservable { private
常见的PHP五种设计模式小结_网学
浏览:
observers = array();
public function addCustomer( $name ) { foreach( $this->_observers as $obs ) $obs->onChanged( $this, $name ); }
public function addObserver( $observer ) { $this->_observers []= $observer; } }
class UserListLogger implements IObserver { public function onChanged( $sender, $args ) { echo( "''$args'' added to user list\n" ); } }
$ul = new UserList(); $ul->addObserver( new UserListLogger() ); $ul->addCustomer( "Jack" ); ?>
|
此