downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
search for in the  

<Object IterationMagic Methods>
Last updated: Thu, 26 Jun 2008

Patterns

Patterns are ways to describe best practices and good designs. They show a flexible solution to common programming problems.

Factory

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');
?>

Singleton

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;

?>


add a noteadd a note User Contributed Notes
Patterns
There are no user contributed notes for this page.




<Object IterationMagic Methods>
Last updated: Thu, 26 Jun 2008
show source | credits | sitemap | contact | advertising | mirror sites
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: http://phpbuilder.com/
Last updated: Tue Nov 1 20:20:59 2005 EST
Columns / Articles | Tips / Quickies | News | News Linking and RSS Feeds | Shared Code Library
Mail Archives | Support / Discussion Forums | Get Started! Links | Contribute! | Docs