###模式定义 多例模式和单例模式类似,但可以返回多个实例。比如我们有多个数据库连接,MySQL、SQLite、Postgres,又或者我们有多个日志记录器,分别用于记录调试信息和错误信息,这些都可以使用多例模式实现。 ###UML类图  ###示例代码 Multiton.php ```php <?php namespace App\Sheji\Multiton; /** * Multiton类 */ class Multiton { /** * * 第一个实例 */ const INSTANCE_1 = '1'; /** * * 第二个实例 */ const INSTANCE_2 = '2'; /** * 实例数组 * * @var array */ private static $instances = array(); /** * 构造函数是私有的,不能从外部进行实例化 * */ private function __construct() { } /** * 通过指定名称返回实例(使用到该实例的时候才会实例化) * * @param string $instanceName * * @return Multiton */ public static function getInstance($instanceName) { if (!array_key_exists($instanceName, self::$instances)) { self::$instances[$instanceName] = new self(); } return self::$instances[$instanceName]; } /** * 防止实例从外部被克隆 * * @return void */ private function __clone() { } /** * 防止实例从外部反序列化 * * @return void */ private function __wakeup() { } } ``` ###测试代码 Tests/PoolTest.php ```php <?php namespace App\Sheji\Pool\Tests; use App\Sheji\Pool\Pool; class PoolTest extends \PHPUnit_Framework_TestCase { public function testPool() { $pool = new Pool('App\Sheji\Pool\Tests\TestWorker'); $worker = $pool->get(); $this->assertEquals(1, $worker->id); $worker->id = 5; $pool->dispose($worker); $this->assertEquals(5, $pool->get()->id); $this->assertEquals(1, $pool->get()->id); } } ``` Tests/TestWorker.php ```php <?php namespace App\Sheji\Pool\Tests; class TestWorker { public $id = 1; } ``` ###总结 - 作为对象的创建模式,多例模式中的多例类可以有多个实例。 - 多例类必须自己创建,自己管理自己的实例,并向外界提供自己的实例。