<?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();
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();
运行结果:
-------------男黄种人----------------
黄色人类会大笑,幸福呀!
黄色人类会哭
黄色人类会说话,一般说的都是双字节
该黄种人的性别为男...
-------------女黄种人----------------
黄色人类会大笑,幸福呀!
黄色人类会哭
黄色人类会说话,一般说的都是双字节
该黄种人的性别为女...