Fixed wrong implementation of Singleton Pattern

This commit is contained in:
Marius Bogdan 2015-12-12 22:44:19 +01:00
parent dab22757a7
commit df060dab97
3 changed files with 37 additions and 4 deletions

View File

@ -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');
}
}

View File

@ -0,0 +1,8 @@
<?php
namespace DesignPatterns\Creational\Singleton;
class SingletonPatternViolationException extends \Exception
{
}

View File

@ -26,4 +26,25 @@ class SingletonTest extends \PHPUnit_Framework_TestCase
$meth = $refl->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);
}
}