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 19-25. 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 19-26. 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);
  ?>
 |  
  |