这篇文章介绍的内容是关于PHP设计模式之抽象工厂 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

在学习过工厂方法之后,我所了解的工厂方法基本是去创建一个对象,

例如在玩游戏的时候,创建了一个关羽英雄,一个张飞英雄这样。

但是有时候程序设计时可能需要创建一组对象,这就出现了第二种创建型设计模式--抽象工厂方法(AbstractFactory)。

比方说,我在创建关羽的时候手上拿着青龙偃月刀,骑着赤兔马。

创建刘备的时候手上拿着雌雄双剑,骑着的卢马。

那么他们的兵器就需要一个类去实现,马又需要另外一个类去实现。

人物 + 兵器 +坐骑 就成了一个组合。

最后通过一个抽象工厂的模式去实现组合创建。

记录代码如下:<?php

/** Hero

* 定义一个英雄接口

*/

interface Hero

{

function CreateHero();

}

/** GuanYu

* 关羽英雄类

*/

Class GuanYu implements Hero

{

function CreateHero()

{

echo "关羽加入战场-->";

}

}

/** LiuBei

* 刘备英雄类

*/

Class LiuBei implements Hero

{

function CreateHero()

{

echo "刘备加入战场-->";

}

}

/** Weapon

* 定义一个兵器接口

*/

interface Weapon

{

function CreateWeapon();

}

/** GuanYuWeapon

* 青龙偃月刀的类

*/

Class GuanYuWeapon implements Weapon

{

function CreateWeapon()

{

echo "手持青龙偃月刀-->";

}

}

/** LiuBeiWeapon

* 雌雄双剑的类

*/

Class LiuBeiWeapon implements Weapon

{

function CreateWeapon()

{

echo "手持雌雄双剑-->";

}

}

/** Horse

* 定义一个坐骑接口

*/

interface Horse

{

function CreateHorse();

}

/** ChiTu

* 赤兔马类

*/

Class ChiTu implements Horse

{

function CreateHorse()

{

echo "脚蹬赤兔马。";

}

}

/** DiLu

* 的卢马类

*/

Class DiLu implements Horse

{

function CreateHorse()

{

echo "脚蹬的卢马。";

}

}

/** AbstractFactory

* 抽象工厂接口 为子类建立标准

* LoadingHero 加载人物类方法

* LoadingWeapon 加载武器类方法

* LoadingHorse 加载坐骑类方法

*/

interface AbstractFactory

{

function LoadingHero();

function LoadingWeapon();

function LoadingHorse();

}

/** GFactory

* 关羽英雄创建工厂类 用于客户端调用

*/

Class GFactory implements AbstractFactory

{

function LoadingHero()

{

return new GuanYu();

}

function LoadingWeapon()

{

return new GuanYuWeapon();

}

function LoadingHorse()

{

return new ChiTu();

}

}

/** LFactory

* 刘备英雄创建工厂类 用于客户端调用

*/

Class LFactory implements AbstractFactory

{

function LoadingHero()

{

return new LiuBei();

}

function LoadingWeapon()

{

return new LiuBeiWeapon();

}

function LoadingHorse()

{

return new DiLu();

}

}<?php

// 抽象工厂模式 index.php

header("Content-Type:text/html;charset=utf-8");

require_once "AbstractFactory.php";

echo "-----------------创建第一个英雄-----------------
";

$GY = new GFactory(); // 调用第一个英雄的工厂

// 加载各自的创建方法

$GYHero = $GY->LoadingHero();

$GYWeapon = $GY->LoadingWeapon();

$GYHorse = $GY->LoadingHorse();

// 生成加入战场

$GYHero->CreateHero();

$GYWeapon->CreateWeapon();

$GYHorse->CreateHorse();

echo "
";

echo "-----------------创建第二个英雄-----------------
";

$LB = new LFactory(); // 调用第一个英雄的工厂

// 加载各自的创建方法

$LBHero = $LB->LoadingHero();

$LBWeapon = $LB->LoadingWeapon();

$LBHorse = $LB->LoadingHorse();

// 生成加入战场

$LBHero->CreateHero();

$LBWeapon->CreateWeapon();

$LBHorse->CreateHorse();

输出的结果:

-----------------创建第一个英雄-----------------

关羽加入战场-->手持青龙偃月刀-->脚蹬赤兔马。

-----------------创建第二个英雄-----------------

刘备加入战场-->手持雌雄双剑-->脚蹬的卢马。

相关推荐:

php 抽象工厂类实例,PHP设计模式之抽象工厂相关推荐

  1. java 用映射写工厂类_java23种设计模式——三、工厂模式

    目录 工厂模式 工厂模式介绍 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为 ...

  2. java工厂模式实例(设计模式)

    目录 java工厂模式 工厂模式其实又分为三种 1.简单工厂模式: 简单工厂模式(非静态) 简单工厂模式(静态): 2.工厂方法模式: 3.抽象工厂模式: java工厂模式 开篇声明,此理解为作者自身 ...

  3. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  4. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式

    抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...

  5. php设计一个盒子类代码_PHP设计模式之简单工厂模式(Simple Factory)代码实例大全(七)...

    目的[1] 简单工厂模式是一个精简版的工厂模式. 它与静态工厂模式最大的区别是它不是『静态』的.因为非静态,所以你可以拥有多个不同参数的工厂,你可以为其创建子类.甚至可以模拟(Mock)它,这对编写可 ...

  6. java静态工厂方法模式_设计模式:简单工厂模式(静态工厂方法模式)

    简单工厂的构成包括三个角色: 1)抽象产品类 2)具体产品类(继承抽闲产品类) 3)工厂类(生产具体产品) 具体代码实现 1.抽象产品类 /** * 抽象类 */ public abstract cl ...

  7. java 工厂模式 计算器_java设计模式之简单工厂模式

    在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装):如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetRes ...

  8. java 工厂类静态方法,为什么要在JAVA工厂模式中使用静态方法

    工厂方法模式( Factory Method ):定义一个用于创建对象的接口 IFactory,在具体的ConcreteFactory子类中根据传进的参数即具体子类ConcreteProduct决定实 ...

  9. 《JavaSE-第七章》之抽象的类-实例的对象-合理的封装

    前言 之前我们所写的代码几乎都是在main方法里面,我们也操作了一些对象如String,Math等.但是将大量的代码写入main里面不是面向对象编程的做法,接下来我们将脱离面向过程,走向面向对象,慢慢 ...

最新文章

  1. Python绘制简单函数曲线(包括坐标范围限制、刻度指定)
  2. 安装 | Windows 10下基于Anaconda平台的TensorFlow详细安装步骤
  3. 每周一算法之六——KMP字符串匹配算法
  4. .NET Core加解密实战系列之——使用BouncyCastle制作p12(.pfx)数字证书
  5. Wordpress基础:精简头部wp_head
  6. MYSQL性能优化(转)
  7. EMC-- DFC --Sessions and Session Managers
  8. 安卓gridview条目点击事件_敬业签的安卓手机版设置便签按正序排序教程
  9. win7和xp无线共享网络问题
  10. 数值分析期末考试复习(逼近问题)
  11. mysql触发器 实例_mysql触发器的三个例子
  12. Halcon 入门教程(01)
  13. linux内存中的文件权限,Linux系统管理(用户权限、磁盘存储、文件系统、内存、进程)...
  14. Unity中迭代器和协程的部分概念
  15. MAC版本subline text快捷键大全
  16. 壁纸最佳分辨率尺寸表
  17. 【杂七杂八】Dreamweaver在Surface高分辨率下工具栏字体和按钮太小的解决办法
  18. transition和transition的区别
  19. 一个汽车软件测试工程师的三年工作总结
  20. python笔迹识别_python_基于KNN算法的笔迹识别

热门文章

  1. tess 英文字库(eng.traineddata)
  2. 语言模型(LM)介绍及实操
  3. Windows串口编程
  4. VUE程序运行过程-runtime-complier和runtime-only的区别
  5. 测试用例的力度和评审、测试用例的本质
  6. IoT黑板报0217:Alphabet联网气球项目取得新突破
  7. 佳能EOS R3评测
  8. oracle按时间段过滤查询,oracle 取某个时间段的数据(每周几的上午几点到几点)...
  9. win10+linux双系统给linux系统分区内存扩容
  10. (二十二)岁月无声 - 7