
为某个类创建仅有一个可访问的实例.
class Singleton
{
private static $instance;
/**
* Singleton constructor.
*/
private function __construct()
{
}
/**
* return self instance.
*
* @return self
*/
public static function getInstance()
{
if(!self::$instance){
self::$instance = new self();
}
return self::$instance;
}
/**
* 防止对象被clone.
*/
private function __clone()
{
trigger_error('clone is not allowed!');
}
}
多个类的单例模式
abstract class FactoryAbstract
{
protected static $intances = [];
/**
* FactoryAbstract constructor.
*/
protected function __construct()
{
}
public static function getInstance()
{
$className = self::getClassName();
if(empty(self::$intances[$className])){
self::$intances[$className] = new $className();
}
return self::$intances[$className];
}
public static function removeInstance()
{
$className = self::getClassName();
if(array_key_exists($className, self::$intances)){
unset(self::$intances[$className]);
}
}
final protected static function getClassName()
{
return get_called_class();
}
final protected function __clone()
{
}
}
abstract class Factory extends FactoryAbstract
{
final public static function getInstance()
{
return parent::getInstance();
}
final public static function removeInstance()
{
parent::removeInstance();
}
}
// @test
class FirstProduce extends Factory
{
public $a = [];
}
class SecondProduce extends Factory
{
}
FirstProduce::getInstance()->a[] = 1;
FirstProduce::getInstance()->a[] = 2;
SecondProduce::getInstance()->a[] = 11;
SecondProduce::getInstance()->a[] = 12;
print_r(FirstProduce::getInstance()->a);
// Array
//(
// [0] => 1
// [1] => 2
//)
print_r(SecondProduce::getInstance()->a);
//Array
//(
// [0] => 11
// [1] => 12
//)




近期评论