第 6 章 抽象工厂模式

<?php
header("Content-type: text/html; charset=UTF-8");
/**
* 抽象工厂模式【Abstract Factory Pattern】
*/

/**
* 定义一个人类的统称,问题出来了,刚刚定义的时候忘记定义性别了
* 这个重要的问题非修改不可,否则这个世界上太多太多的东西不存在了
*/
interface Human {
    //首先定义什么是人类
    
    //人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了;
    public function laugh();
    
    //人类还会哭,代表痛苦
    public function cry();
    
    //人类会说话
    public function talk();
    
    //定义性别
    public function sex();
}

/**
* 黄种人的抽象类
* 为什么要修改成抽象类呢?要定义性别呀
*/
abstract class AbstractYellowHuman implements Human {
    public function cry() {
        echo "黄色人类会哭";
    }
    
    public function laugh() {
        echo "黄色人类会大笑,幸福呀!";
    }
    
    public function talk() {
        echo "黄色人类会说话,一般说的都是双字节";
    }
}


/**
* 白种人的抽象类
*/
abstract class AbstractWhiteHuman implements Human {
    public function cry() {
        echo "白色人类会哭";
    }

    public function laugh() {
        echo "白色人类会大笑,侵略的笑声";
    }

    public function talk() {
        echo "白色人类会说话,一般都是但是单字节!";
    }
}


/**
* 黑种人的抽象类
*/
abstract class AbstractBlackHuman implements Human {
    public function cry() {
        echo "黑人会哭";
    }

    public function laugh() {
        echo "黑人会笑";
    }

    public function talk() {
        echo "黑人可以说话,一般人听不懂";
    }
}

// 黄种人的实现类:

/**
* 女性黄种人
*/
class YellowFemaleHuman extends AbstractYellowHuman {
    public function sex(){
        echo "该黄种人的性别为女...";
    }
}


/**
* 男性黄种人
*/
class YellowMaleHuman extends AbstractYellowHuman {
    public function sex(){
        echo "该黄种人的性别为男...";
    }
}


// 白种人的实现类:

/**
* 女性白种人
*/
class WhiteFemaleHuman extends AbstractWhiteHuman {
    public function sex(){
        echo "该白种人的性别为女...";
    }
}


/**
* 男性白种人
*/
class WhiteMaleHuman extends AbstractWhiteHuman {
    public function sex(){
        echo "该白种人的性别为男...";
    }
}


// 黑种人的实现类:

/**
* 女性黑种人
*/
class BlackFemaleHuman extends AbstractBlackHuman {
    public function sex(){
        echo "该黑种人的性别为女...";
    }
}


/**
* 男性黑种人
*/
class BlackMaleHuman extends AbstractBlackHuman {
    public function sex(){
        echo "该黑种人的性别为男...";
    }
}



// 我们看我们的工厂类,先看接口

/**
* 先定一个接口,应该要造不同性别的人,需要不同的生产线
* 那这个八卦炉必须可以制造男人和女人
*/
interface HumanFactory {
    //制造黄色人类
    public function createYellowHuman();
    
    //制造一个白色人类
    public function createWhiteHuman();
    
    //制造一个黑色人类
    public function createBlackHuman();
}


/**
* 男性创建工厂
*/
class MaleHumanFactory implements HumanFactory {
    //创建一个男性黑种人
    public function createBlackHuman() {
        return new BlackMaleHuman();
    }
    
    //创建一个男性白种人
    public function createWhiteHuman() {
        return new WhiteMaleHuman();
    }
    
    //创建一个男性黄种人
    public function createYellowHuman() {
        return new YellowMaleHuman();
    }
}


/**
* 女性创建工厂
*/
class FemaleHumanFactory implements HumanFactory {
    //创建一个女性黑种人
    public function createBlackHuman() {
        return new BlackFemaleHuman();
    }

    //创建一个女性白种人
    public function createWhiteHuman() {
        return new WhiteFemaleHuman();
    }

    //创建一个女性黄种人
    public function createYellowHuman() {
        return new YellowFemaleHuman();
    }
}




// 产品定义好了,工厂也定义好了,万事俱备只欠东风,那咱就开始造吧,哦,不对,女娲开始造人了:
/**
* 女娲建立起了两条生产线,分别是:
* 男性生产线
* 女性生产线
*/
class NvWa {
    
    function __construct(){
        //第一条生产线,男性生产线
        $maleHumanFactory = new MaleHumanFactory();
        
        //第二条生产线,女性生产线
        $femaleHumanFactory = new FemaleHumanFactory();
        
        //生产线建立完毕,开始生产人了:
        $maleYellowHuman = $maleHumanFactory->createYellowHuman();
        echo "-------------男黄种人----------------<br>";
        echo $maleYellowHuman->laugh().str_repeat("<br>", 1);
        echo $maleYellowHuman->cry().str_repeat("<br>", 1);
        echo $maleYellowHuman->talk().str_repeat("<br>", 1);
        echo $maleYellowHuman->sex().str_repeat("<br>", 1);
        echo str_repeat("<br>", 2);
        
        $femaleYellowHuman = $femaleHumanFactory->createYellowHuman();
        echo "-------------女黄种人----------------<br>";
        echo $femaleYellowHuman->laugh().str_repeat("<br>", 1);
        echo $femaleYellowHuman->cry().str_repeat("<br>", 1);
        echo $femaleYellowHuman->talk().str_repeat("<br>", 1);
        echo $femaleYellowHuman->sex().str_repeat("<br>", 1);
        echo str_repeat("<br>", 2);
        
    }
}

/**
* 两个八卦炉,一个造女的,一个造男的,开足马力,一直造到这个世界到现在这个模式为止。
* 抽象工厂模式讲完了,那我们再思考一些问题:工厂模式有哪些优缺点?先说优点,我这人一般先看
* 人优点,非常重要的有点就是,工厂模式符合OCP 原则,也就是开闭原则,怎么说呢,比如就性别的问题,
* 这个世界上还存在双性人,是男也是女的人,那这个就是要在我们的产品族中增加一类产品,同时再增加
* 一个工厂就可以解决这个问题,不需要我再来实现了吧,很简单的大家自己画下类图,然后实现下。
* 那还有没有其他好处呢?抽象工厂模式,还有一个非常大的有点,高内聚,低耦合,在一个较大的项
* 目组,产品是由一批人定义开发的,但是提供其他成员访问的时候,只有工厂方法和产品的接口,
*/
new NvWa();


运行结果:

-------------男黄种人----------------
黄色人类会大笑,幸福呀!
黄色人类会哭
黄色人类会说话,一般说的都是双字节
该黄种人的性别为男...


-------------女黄种人----------------
黄色人类会大笑,幸福呀!
黄色人类会哭
黄色人类会说话,一般说的都是双字节
该黄种人的性别为女...









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值