第 4 章 多例模式

<?php
header("Content-type: text/html; charset=UTF-8");
/**
* 多例模式
* 这种情况有没有?有!大点声,有没有? 有!,是,确实有,就出现在明朝,那三国期间的算不算,
* 不算,各自称帝,各有各的地盘,国号不同。大家还记得那首诗《石灰吟》吗?作者是谁?于谦,他是被
* 谁杀死的?明英宗朱祁镇,对,就是那个在土木堡之变中被瓦刺俘虏的皇帝,被俘虏后,他弟弟朱祁钰当
* 上了皇帝,就是明景帝,估计当上皇帝后乐疯了,忘记把老哥朱祁镇削为太上皇了,我Shit,在中国的历
* 史上就这个时期是有2 个皇帝,你说这期间的大臣多郁闷,两个皇帝耶,两个精神依附对象呀。
* 这个场景放到我们设计模式中就是叫有上限的多例模式(没上限的多例模式太容易了,和你直接new 一
* 个对象没啥差别,不讨论)
*/


class Emperor {
    private static $maxNumOfEmperor = 2; //最多只能有两个皇帝
    
    private static $emperorList= array(); //装皇帝的列表;
    
    private static $countNumOfEmperor = 0; //正在被人尊称的是那个皇帝
    
    private $emperorInfo = null; //皇帝叫什么名字
    
    private function __construct($info = null){
        $this->emperorInfo = $info;
    }
    
    /**
     * 返回多例中的一个对象,随机或者指定
     * @param $objNum
     */
    public static function getInstance($objNum = null){
        // 初始化生成多个对象
        if(!self::$emperorList){
            for($i =0; $i < self::$maxNumOfEmperor; $i++){
                self::$emperorList[$i] = new self("皇".($i+1)."帝");
            }
        }
        
        // 返回对象
        if(!is_null($objNum) && (int) $objNum < self::$maxNumOfEmperor){
            $i = (int) $objNum;
        }else{
            $i = rand(0, self::$maxNumOfEmperor-1);
        }
        return self::$emperorList[$i];
    }
    
    public function emperorInfo(){
        return $this->emperorInfo;
    }
}

/**
* 大臣们悲惨了,一个皇帝都伺候不过来了,现在还来了两个个皇帝
* TND,不管了,找到个皇帝,磕头,请按就成了!
*/
class Minister {
    function __construct(){
        for($i =0, $num = 10; $i < $num; $i++){
            echo "第".($i+1)."个大臣参拜的是:";
            echo Emperor::getInstance()->emperorInfo();
            echo str_repeat("<br>", 2);
        }
    }
}

new Minister();



运行结果如下:

第1个大臣参拜的是:皇2帝

第2个大臣参拜的是:皇2帝

第3个大臣参拜的是:皇1帝

第4个大臣参拜的是:皇2帝

第5个大臣参拜的是:皇2帝

第6个大臣参拜的是:皇2帝

第7个大臣参拜的是:皇1帝

第8个大臣参拜的是:皇2帝

第9个大臣参拜的是:皇2帝

第10个大臣参拜的是:皇2帝


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值