diff --git a/language/oop5/patterns.xml b/language/oop5/patterns.xml index 8499ecee22..dae6a83988 100644 --- a/language/oop5/patterns.xml +++ b/language/oop5/patterns.xml @@ -6,7 +6,7 @@ Patterns are ways to describe best practices and good designs. They show a flexible solution to common programming problems. - + Factory @@ -55,85 +55,100 @@ $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. + The Singleton ensures that there can be only one instance of a Class and provides a + global access point to that instance. Singleton is a "Gang of Four" Creational Pattern. + The Singleton pattern is often implemented in Database Classes, Loggers, Front + Controllers or Request and Response objects. + + - Singleton Function - -Singleton example + count++; } - // Prevent users to clone the instance public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } + public function __wakeup() + { + trigger_error('Unserializing is not allowed.', E_USER_ERROR); + } } - ?> ]]> - - This allows a single instance of the Example - class to be retrieved. - - -Illustrated below is how the Singleton behaves + increment(); // 0 +echo $singleton->increment(); // 1 -// 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; +$singleton = Example::singleton(); // reuses existing instance now +echo $singleton->increment(); // 2 +echo $singleton->increment(); // 3 +// all of these will raise a Fatal Error +$singleton2 = new Example; +$singleton3 = clone $singleton; +$singleton4 = unserialize(serialize($singleton)); ?> -]]> + ]]> + + + The Singleton pattern is one of the more controversial patterns. Critics argue that + Singletons introduce Global State into an application and tightly couple the Singleton + and its consuming classes. This leads to hidden dependencies and unexpected side-effects, + which in turn leads to code that is harder to test and maintain. + + + Critics further argue that it is pointless to use a Singleton in a Shared Nothing Architecture + like PHP where objects are unique within the Request only anyways. It is easier and cleaner to + create collaborator object graphs by using Builders and Factory patterns once at the beginning + of the Request. + + + Singletons also violate several of the "SOLID" OOP design principles and the Law of Demeter. + Singletons cannot be serialized. They cannot be subtyped (before PHP 5.3) and won't be Garbage + Collected because of the instance being stored as a static attribute of the Singleton. + + - - + +