上篇文章,咱们说过了单例模式,有童鞋会问:有单例,是否是有多例?答案:是的,这篇文章,咱们来聊一下多例模式。数据库
多例模式,就是一个类有多个实例,并且该实例都是该类自己。这样的类叫作多例类,具备如下:设计模式
简单啰嗦一句,跟普通咱们new对象不同,咱们能够屡次new对象,可是每次new的对象都是一个新的对象;而多例类里面全部的实例都是该类自己。数组
下面咱们来看一下具体的代码实现:
逻辑:CD工厂要不不一样的内容受权给不一样的工厂去生产:把CD1的内容让工厂1生产;CD2的内容让工厂2生产。这样能够减小CD工厂的数量,增长CD工厂的扩展性。函数
class CDFactory { /** * 实例对象数组 * * @var array */ private static $_instances = []; /** * 构造函数私有,防止类能够经过 new 实例化 * * @access private * @return void */ private function __construct () { } /** * 私有化复制克隆方法,防止类别复制和克隆 * * @access private * @return void */ private function __clone () { } /** * 阻止实例被序列化 * * @access private * @return void */ private function __wakeup () { } /** * 定义获取对象实例的入口,返回该实例 * * @access public * @param string $name 实例化名字 * @return self */ public static function getInstance (string $name) { // 判断是否已经存在实例化对象 if (!isset(self::$_instances[$name])) { p('new intance:' . __CLASS__); // 不存在,则实例化一个 self::$_instances[$name] = new self(); } return self::$_instances[$name]; } /** * 此接口用来测试单例模式 - 改变 string 的值 * * @access public * @param string $string 值 * @return void */ public function setContent($string) { $this->string = $string; } /** * 此接口用来测试单例模式 - 输出 string 的值 * * @access public * @return void */ public function getContent() { p('$this->string',$this->string); } }
调用的代码:测试
class Client { static public function factory1Produce() { $cd = CDFactory::getInstance('CD1'); $cd->setContent('CD 1 内容~'); return $cd; } static public function factory2Produce() { $cd = CDFactory::getInstance('CD2'); $cd->setContent('CD 2 内容~'); return $cd; } /** * 主函数 */ static public function main() { //工厂1生产 $cd_1 = static::factory1Produce(); $cd_1->getContent(); //工厂2生产 $cd_2 = static::factory2Produce(); $cd_2->getContent(); } }
执行结果:this
new intance:CDFactory $this->string= string(12) "CD 1 内容~" new intance:CDFactory $this->string= string(12) "CD 2 内容~"
执行结果里面咱们能够看到,new intance:CDFactory调用了两次,实现了一个类有多个实例,由于咱们的实例是存在 $_instances 数组中,因此每次new intance又都是CD类自己。设计
在实际应用中,多例模式能够用在处理多个数据库链接器等类似功能,可是不一样实例的状况。code
多例模式和单例模式是比较简单的设计模式,同时也是被常常使用的设计模式,尤为是单例模式,好比 ThinkPHP中的Cache就是用的多例模式,可是Redis链接的处理就是用的单例模式。对象