Patterns are ways to describe best practices and good designs. They show a flexible solution to common programming problems.
The Factory pattern allows for the instantiation of objects at runtime. It is called a Factory Pattern since it is responsible for "manufacturing" an object. A Parameterized Factory receives the name of the class to instantiate as argument.
Example #1 Parameterized Factory Method
<?php
class Example
{
// The parameterized factory method
public static function factory ( $type )
{
if (include_once 'Drivers/' . $type . '.php' ) {
$classname = 'Driver_' . $type ;
return new $classname ;
} else {
throw new Exception ( 'Driver not found' );
}
}
}
?> Defining this method in a class allows drivers to be loaded on the fly. If the Example class was a database abstraction class, loading a MySQL and SQLite driver could be done as follows:
<?php
// Load a MySQL Driver
$mysql = Example :: factory ( 'MySQL' );
// Load a SQLite Driver
$sqlite = Example :: factory ( 'SQLite' );
?> The Singleton pattern applies to situations in which there needs to be a single instance of a class. The most common example of this is a database connection. Implementing this pattern allows a programmer to make this single instance easily accessible by many other objects.
Example #2 Singleton Function
<?php
class Example
{
// Hold an instance of the class
private static $instance ;
// A private constructor; prevents direct creation of object
private function __construct ()
{
echo 'I am constructed' ;
}
// The singleton method
public static function singleton ()
{
if (!isset( self :: $instance )) {
$c = __CLASS__ ;
self :: $instance = new $c ;
}
return self :: $instance ;
}
// Example method
public function bark ()
{
echo 'Woof!' ;
}
// Prevent users to clone the instance
public function __clone ()
{
trigger_error ( 'Clone is not allowed.' , E_USER_ERROR );
}
}
?> This allows a single instance of the Example class to be retrieved.
<?php
// This would fail because the constructor is private
$test = new Example ;
// This will always retrieve a single instance of the class
$test = Example :: singleton ();
$test -> bark ();
// This will issue an E_USER_ERROR.
$test_clone = clone $test ;
?> © 2005-2008 BlaBla.cn 版权所有