第 5 章 工厂方法模式

<?php
header("Content-type: text/html; charset=UTF-8");
/**
* 工厂方法模式
* 女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这
* 个词被现代人滥用了。这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛
* 蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到
* 都是静态的东西呀,怎么办?
* 别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,
* 具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:
* 第一次烤泥人,兹兹兹兹~~,感觉应该熟了,往地上一扔,biu~,一个白人诞生了,没烤熟!
* 第二次烤泥人,兹兹兹兹兹兹兹兹~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,黑人哪!
* 第三次烤泥人,兹~兹~兹~,一边烤一边看着,嘿,正正好,Perfect!优品,黄色人类!【备注:RB 人不属此列】
*
*/

/**
* 定义一个人类的统称
*/
interface Human {
    //首先定义什么是人类
    
    //人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了;
    public function laugh();
    
    //人类还会哭,代表痛苦
    public function cry();
    
    //人类会说话
    public function talk();    
    
    // 类名
    public function getClassname();
}

// 然后定义具体的人类:

/**
* 黄色人类,这个翻译的不准确,将就点吧
*/
class YellowHuman implements Human {
    function laugh(){
        return "黄色人类会哭";
    }
    
    function cry(){
        return "黄色人类会大笑,幸福呀!";
    }
    
    function talk(){
        return "黄色人类会说话,一般说的都是双字节";
    }

    function getClassname(){
        return __CLASS__;
    }
}

/**
* 白色人类
*/
class WhiteHuman implements Human {
    function laugh(){
        return "白色人类会哭";
    }
    
    function cry(){
        return "白色人类会大笑,侵略的笑声";
    }
    
    function talk(){
        return "白色人类会说话,一般都是但是单字节!";
    }

    function getClassname(){
        return __CLASS__;
    }
}


/**
* 黑色人类,记得中学学英语,老师说black man是侮辱人的意思,不懂,没跟老外说话
*/
class BlackHuman implements Human {
    function laugh(){
        return "黑人会哭";
    }
    
    function cry(){
        return "黑人会笑";
    }
    
    function talk(){
        return "黑人可以说话,一般人听不懂";
    }

    function getClassname(){
        return __CLASS__;
    }
}


// 人类也定义完毕了,那我们把八卦炉定义出来:
class HumanFactory {
    private static $objNames = array('YellowHuman', 'WhiteHuman', 'BlackHuman');
    
    private static $obj = array();
    
    public static function createHuman($human = null){
        $humanObj = null;
        
        if($human instanceof Human){
            $humanObj = $human;
        }else{
            /**
             * 避免多次实例对象
             * 工厂方法模式还有一个非常重要的应用,就是延迟始化(Lazy initialization),什么是延迟始化呢?
             * 一个对象初始化完毕后就不释放,等到再次用到得就不用再次初始化了,直接从内存过中拿到就可以了
             */
            try {
                $objName = self::$objNames[rand(0, count(self::$objNames)-1)];
                self::$obj[strtolower($objName)] || self::$obj[strtolower($objName)] = new $objName;
            } catch (Exception $e) {
                $objName = self::$objNames[0];
                self::$obj[strtolower($objName)] || self::$obj[strtolower($objName)] = new $objName;
            }
            $humanObj = self::$obj[strtolower($objName)];
        }
        return $humanObj;
    }
    
}


/**
* 首先定义女娲,这真是额的神呀
*/
class NvWa {
    function __construct(){
        //女娲第一次造人,试验性质,少造点,火候不足,缺陷产品
        echo "------------造出的第一批人是这样的:白人-----------------<br>";
        $whiteHuman = HumanFactory::createHuman(new WhiteHuman());
        echo $whiteHuman->laugh().str_repeat("<br>", 1);
        echo $whiteHuman->cry().str_repeat("<br>", 1);
        echo $whiteHuman->talk().str_repeat("<br>", 1);
        echo str_repeat("<br>", 2);
        
        //女娲第二次造人,火候加足点,然后又出了个次品,黑人
        echo "------------造出的第二批人是这样的:黑人-----------------<br>";
        $blackHuman = HumanFactory::createHuman(new BlackHuman());
        echo $blackHuman->laugh().str_repeat("<br>", 1);
        echo $blackHuman->cry().str_repeat("<br>", 1);
        echo $blackHuman->talk().str_repeat("<br>", 1);
        echo str_repeat("<br>", 2);
        
        //女娲第二次造人,火候加足点,然后又出了个次品,黑人
        echo "------------造出的第三批人是这样的:黄色人类-----------------<br>";
        $yellowHuman = HumanFactory::createHuman(new YellowHuman());
        echo $yellowHuman->laugh().str_repeat("<br>", 1);
        echo $yellowHuman->cry().str_repeat("<br>", 1);
        echo $yellowHuman->talk().str_repeat("<br>", 1);
        echo str_repeat("<br>", 2);
        
        //女娲烦躁了,爱是啥人类就是啥人类,烧吧
        for($i=0, $num = 10; $i<$num; $i++){
            echo "------------随机产生人类了-----------------". ($i+1) ."<br>";
            $human = HumanFactory::createHuman();
            echo $human->cry().str_repeat("<br>", 1);
            echo $human->laugh().str_repeat("<br>", 1);
            echo $human->talk().str_repeat("<br>", 1);
            echo str_repeat("<br>", 2);
        }
    }
}


new NvWa();


运行结果:

------------造出的第一批人是这样的:白人-----------------
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!


------------造出的第二批人是这样的:黑人-----------------
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂


------------造出的第三批人是这样的:黄色人类-----------------
黄色人类会哭
黄色人类会大笑,幸福呀!
黄色人类会说话,一般说的都是双字节


------------随机产生人类了-----------------1
白色人类会大笑,侵略的笑声
白色人类会哭
白色人类会说话,一般都是但是单字节!


------------随机产生人类了-----------------2
黑人会笑
黑人会哭
黑人可以说话,一般人听不懂


------------随机产生人类了-----------------3
白色人类会大笑,侵略的笑声
白色人类会哭
白色人类会说话,一般都是但是单字节!


------------随机产生人类了-----------------4
黑人会笑
黑人会哭
黑人可以说话,一般人听不懂


------------随机产生人类了-----------------5
黑人会笑
黑人会哭
黑人可以说话,一般人听不懂


------------随机产生人类了-----------------6
白色人类会大笑,侵略的笑声
白色人类会哭
白色人类会说话,一般都是但是单字节!


------------随机产生人类了-----------------7
白色人类会大笑,侵略的笑声
白色人类会哭
白色人类会说话,一般都是但是单字节!


------------随机产生人类了-----------------8
白色人类会大笑,侵略的笑声
白色人类会哭
白色人类会说话,一般都是但是单字节!


------------随机产生人类了-----------------9
黄色人类会大笑,幸福呀!
黄色人类会哭
黄色人类会说话,一般说的都是双字节


------------随机产生人类了-----------------10
白色人类会大笑,侵略的笑声
白色人类会哭
白色人类会说话,一般都是但是单字节!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值