PHP 设计模式 抽象工厂

上篇文章说了PHP下的简单工厂(静态工厂) 和工厂模式,现在说一下抽象工厂模式

工厂模式我们已经说过,增加一个产品很简单,增加对应的产品类和工厂类,不需要对原有代码进行改动,符合开闭原则
现在接着上篇文章,我们又有了新的需求,我们要求苹果味饮料和香蕉味饮料,有百事和可口可乐两个品牌,用工厂模式,就实现不了了,我只能增加单一的产品,但是增加品牌我实现不了,引申而出抽象工厂模式,代码如下

<?php
/**
 * Created by PhpStorm.
 * User: tiansi
 * Date: 18/1/23
 * Time: 下午5:10
 */

//工厂接口
interface FruitFactory{

    //生产饮料方法
    function makeAppleFruit();

    function makeBananaFruit();

}

//饮料接口
interface Fruit{

    function getFruitName();
}

class BaishiAppleFruit implements Fruit{

    function getFruitName()
    {
        return '百事苹果味饮料';
    }
}

class BaishiBananaFruit implements Fruit{

    function getFruitName()
    {
        return '百事香蕉味饮料';
    }
}
class ColeiAppleFruit implements Fruit{

    function getFruitName()
    {
        return '可口可乐苹果味饮料';
    }
}

class ColeBananaFruit implements Fruit{

    function getFruitName()
    {
        return '可口可乐香蕉味饮料';
    }
}

//百事饮料工厂
class BaishiFruitFactory implements FruitFactory{

    function makeAppleFruit()
    {
        //生产百事苹果饮料
        return new BaishiAppleFruit();
    }

    function makeBananaFruit()
    {
        //生产百事香蕉饮料
        return new BaishiBananaFruit();
    }
}

//可口可乐饮料工厂
class ColeFruitFactory implements FruitFactory{

    function makeAppleFruit()
    {
        //生产可口可乐苹果饮料
        return new ColeiAppleFruit();
    }

    function makeBananaFruit()
    {
        //生产可口可乐香蕉味饮料
        return new ColeBananaFruit();
    }
}

$baishi_factory = new BaishiFruitFactory();
$baishi_factory->makeAppleFruit();
$baishi_factory->makeBananaFruit();

$cole_factory = new ColeFruitFactory();
$cole_factory->makeAppleFruit();
$cole_factory->makeBananaFruit();

现在我们可以看到 如果想要再增加一个品牌的话 只需要再写一个工厂类 并写上对应的产品类 就可以在不改动原有代码的前提下 成功增加品牌
但是这会儿想要再增加一个单一产品,就很麻烦了,需要更改工厂类,这就是工厂和抽象工厂的区别

工厂模式针对于单一产品,一个产品抽象类,每个工厂只能创建一个产品,支持扩展单个产品,不支持扩展产品族,针对一个产品等级结构
抽象工厂针对于产品族,多个产品抽象类,每个工厂能创建多个产品,支持扩展产品族,不支持扩展单个产品,针对多个产品等级结构

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值