模式定义
与单例模式类似,只是多例模式能够返回多个实例;
应用场景
- 多个数据库连接(mysql、MongoDb、SQLite)
- 多种日志记录
UML类图
代码实现
Multiton.php
<?php
namespace DesignPatterns\Creational\Multiton;
final class Multiton
{
const INSTANCE_1 = '1';
const INSTANCE_2 = '2';
/**
* @var Multiton[]
*/
private static $instances = [];
/**
* this is private to prevent from creating arbitrary instances
*/
private function __construct()
{
}
public static function getInstance(string $instanceName): Multiton
{
if (!isset(self::$instances[$instanceName])) {
self::$instances[$instanceName] = new self();
}
return self::$instances[$instanceName];
}
/**
* prevent instance from being cloned
*/
private function __clone()
{
}
/**
* prevent instance from being unserialized
*/
private function __wakeup()
{
}
}
MultitonTest.php
<?php
namespace DesignPatterns\Creational\Multition\Tests;
use DesignPatterns\Creational\Multiton\Multiton;
use PHPUnit\Framework\TestCase;
class MultitonTest extends TestCase
{
public function testUniqueness()
{
$firstCall = Multiton::getInstance(Multiton::INSTANCE_1);
$secondCall = Multiton::getInstance(Multiton::INSTANCE_1);
$this->assertInstanceOf(Multiton::class, $firstCall);
$this->assertSame($firstCall, $secondCall);
}
public function testUniquenessForEveryInstance()
{
$firstCall = Multiton::getInstance(Multiton::INSTANCE_1);
$secondCall = Multiton::getInstance(Multiton::INSTANCE_2);
$this->assertInstanceOf(Multiton::class, $firstCall);
$this->assertInstanceOf(Multiton::class, $secondCall);
$this->assertNotSame($firstCall, $secondCall);
}
}