深入浅出PHP面向对象与设计模式3--抽象工厂模式

本文探讨了抽象工厂模式在解决跨国生产型企业复杂产品管理问题的应用,通过实例展示了如何利用工厂模式和中心调度实现不同会员等级的个性化产品提供,有效简化了产品分类和管理流程。同时,分析了抽象工厂模式的适用范围和局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://www.phpchina.com/13268/viewspace_15717.html

三、跨国生产型企业--抽象工厂模式

1、设备太多的工厂

如果我们把网站的会员分成三种,青铜、白银、黄金,那么针对不同等级的会员,我们有对应的打折产品和推荐产品给他们。

如果仅仅考虑青铜和白银会员,这样我们要写四个类,分别对应他们的打折产品和推荐产品。

例:3_1

<?php
//青铜会员的打折商品
class BronzeRebateCommodity
{
    //描述
    public $descri = '青铜会员的打折商品';
}

//白银会员的打折商品
class SilverRebateCommodity
{
    //描述
    public $descri = '白银会员的打折商品';
}

//青铜会员的推荐商品
class BronzeCommendatoryCommodity
{
    //描述
    public $descri = '青铜会员的推荐商品';
}

//白银会员的推荐商品
class SilverCommendatoryCommodity
{
    //描述
    public $descri = '白银会员的推荐商品';
}
?>

在获取对应的类的的时候,我们可以使用简单工厂,但是增加产品的时候,不方便管理,比如新增黄金会员。

如果用工厂模式,但是这样做的话,就要添加四个设备,同样不方便管理。

这样就会变成一个很多设备的工厂,可以想象出非常混乱。

2、跨国生产型企业

我们可以借鉴一些跨国生产企业的经验,比如飞利浦,他在不同国家建立工厂,生产适合本地市场的产品。

假设中国的销售分公司,只需要找中国工厂要货就行了。而美国的销售分公司,只需要找美国工厂要货就行了。

那么我们可以建立两个不同的工厂,分别针对青铜和白银会员,生产他们需要的对象。

为了便于管理,我们再设立一个生产运营中心,根据生产需求,调度各个工厂

例:3_2

<?php
//青铜会员的打折商品
class BronzeRebateCommodity
{
    //描述
    public $descri = '青铜会员的打折商品';
}

//白银会员的打折商品
class SilverRebateCommodity
{
    //描述
    public $descri = '白银会员的打折商品';
}

//青铜会员的推荐商品
class BronzeCommendatoryCommodity
{
    //描述
    public $descri = '青铜会员的推荐商品';
}

//白银会员的推荐商品
class SilverCommendatoryCommodity
{
    //描述
    public $descri = '白银会员的推荐商品';
}

//各个工厂的接口
interface ConcreteFactory
{
    //生产对象的方法
    public function create($what);
}

//青铜工厂
class BronzeFactory implements ConcreteFactory
{
    //生产对象的方法
    public function create($what)
    {
       $productName = 'bronze'.$what.'Commodity';
       return new $productName;
    }
}

//白银工厂
class SilverFactory implements ConcreteFactory
{
    //生产对象的方法
    public function create($what)
    {
       $productName = 'silver'.$what.'Commodity';
       return new $productName;
    }
}

//调度中心
class CenterFactory
{
    //获取工厂的方法
    public function getFactory($what)
    {
       $factoryName = $what.'Factory';
       return new $factoryName;
    }
}

//建造一个调度中心
$center = new CenterFactory();
//获得一个白银会员的工厂
$factory = $center->getFactory('silver');
//让工厂制造一个推荐产品
$product = $factory->create('Commendatory');
//可以看到是白银会员的推荐商品
echo $product->descri;
?>

这样一来,我们可以将不同会员的需求分开管理了。

思考:

抽象工厂可以将有相同属性的产品分配到不同的工厂管理,可以减少混乱。

不过这也有一点的问题,比如不是所有的产品都有共性,也不是可以采用同一种分类方法。

如果产品过多,就很容易出现某个产品无法归入某个工厂,或者出现有特殊需要的产品,这时候用抽象工厂比较吃力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值