From df060dab978cac3a0bcd6b002fe11d83f29fbf28 Mon Sep 17 00:00:00 2001 From: Marius Bogdan Date: Sat, 12 Dec 2015 22:44:19 +0100 Subject: [PATCH] Fixed wrong implementation of Singleton Pattern --- Creational/Singleton/Singleton.php | 12 +++++++---- .../SingletonPatternViolationException.php | 8 +++++++ Creational/Singleton/Tests/SingletonTest.php | 21 +++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 Creational/Singleton/SingletonPatternViolationException.php diff --git a/Creational/Singleton/Singleton.php b/Creational/Singleton/Singleton.php index 41a4569..94f7a0a 100644 --- a/Creational/Singleton/Singleton.php +++ b/Creational/Singleton/Singleton.php @@ -2,6 +2,8 @@ namespace DesignPatterns\Creational\Singleton; +use DesignPatterns\Creational\Singleton\SingletonPatternViolationException; + /** * class Singleton */ @@ -36,19 +38,21 @@ class Singleton /** * prevent the instance from being cloned - * + * @throws SingletonPatternViolationException * @return void */ - private function __clone() + public final function __clone() { + throw new SingletonPatternViolationException('This is a Singleton. Clone is forbidden'); } /** * prevent from being unserialized - * + * @throws SingletonPatternViolationException * @return void */ - private function __wakeup() + public final function __wakeup() { + throw new SingletonPatternViolationException('This is a Singleton. __wakeup usage is forbidden'); } } diff --git a/Creational/Singleton/SingletonPatternViolationException.php b/Creational/Singleton/SingletonPatternViolationException.php new file mode 100644 index 0000000..38be5e6 --- /dev/null +++ b/Creational/Singleton/SingletonPatternViolationException.php @@ -0,0 +1,8 @@ +getMethod('__construct'); $this->assertTrue($meth->isPrivate()); } + + /** + * @expectedException \DesignPatterns\Creational\Singleton\SingletonPatternViolationException + * @return void + */ + public function testNoCloneAllowed() + { + $obj1 = Singleton::getInstance(); + $obj2 = clone $obj1; + } + + /** + * @expectedException \DesignPatterns\Creational\Singleton\SingletonPatternViolationException + * @return void + */ + public function testNoSerializationAllowed() + { + $obj1 = Singleton::getInstance(); + $serialized = serialize($obj1); + $obj2 = unserialize($serialized); + } }