初识PHP设计模式--抽象工厂

 在学习过工厂方法之后,我所了解的工厂方法基本是去创建一个对象,
 例如在玩游戏的时候,创建了一个关羽英雄,一个张飞英雄这样。

 但是有时候程序设计时可能需要创建一组对象,这就出现了第二种创建型设计模式-- 抽象工厂方法(AbstractFactory)
 比方说,我在创建关羽的时候手上拿着青龙偃月刀,骑着赤兔马。
 创建刘备的时候手上拿着雌雄双剑,骑着的卢马。
 那么他们的兵器就需要一个类去实现,马又需要另外一个类去实现。
 人物 + 兵器 +坐骑 就成了一个组合。

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

记录代码如下:

<?php  
/**   
 * Created by Sublime.   
 * User: Ryan   
 * Date: 2018/1/13   
 * File: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 "-----------------创建第一个英雄-----------------<br/>";
$GY = new GFactory(); // 调用第一个英雄的工厂

// 加载各自的创建方法
$GYHero = $GY->LoadingHero();
$GYWeapon = $GY->LoadingWeapon();
$GYHorse = $GY->LoadingHorse();

// 生成加入战场
$GYHero->CreateHero();
$GYWeapon->CreateWeapon();
$GYHorse->CreateHorse();

echo "<br/>";

echo "-----------------创建第二个英雄-----------------<br/>";
$LB = new LFactory(); // 调用第一个英雄的工厂

// 加载各自的创建方法
$LBHero = $LB->LoadingHero();
$LBWeapon = $LB->LoadingWeapon();
$LBHorse = $LB->LoadingHorse();

// 生成加入战场
$LBHero->CreateHero();
$LBWeapon->CreateWeapon();
$LBHorse->CreateHorse();


输出的结果:

-----------------创建第一个英雄-----------------
关羽加入战场-->手持青龙偃月刀-->脚蹬赤兔马。
-----------------创建第二个英雄-----------------
刘备加入战场-->手持雌雄双剑-->脚蹬的卢马。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值