PHP设计模式之抽象工厂模式

以下文字部分均为本人自己的想法与总结所以未必正确;

抽象工厂模式:

       概述:抽象工厂模式对同一类产品实现了封装,上层应用(客户端)只需调用相应的工厂接口来创建具体的产品,无需关心产品是如何创建

       优点:

            1、解耦, 分离了客户端和类,客户端只需要去找相应的工厂,则可以得到所需的产品

            2、易于扩展,当水果厂添加某项功能,或者要为水果这类产品添加某项属性时,只需要在抽象工厂和抽象产品类中添加相应接口,其继承者去实现即可。

            3、规范化,可保持接口的一致性。

操作步骤:

       抽象工厂包含4个工厂角色:抽象工厂、具体工厂、抽象产品、具体产品

      1、创建抽象工厂,规定工厂的方法

      2、创建抽象产品,规定产品的方法

      3、具体产品实现抽象产品的方法

      4、具体工厂实现抽象工厂的方法,在方法中返回具体产品的对象

      5、调用者通过具体工厂对象获取产品对象

个人比喻:

      工厂方法模式中讲到,现在成立了集团,集团下很多工厂,并规定了工厂都有“生产产品”这个方法(也就是创建生产者对象),有很多符合该条件的工厂,现在调用者买鸡肉找鸡肉厂,买鸭肉找鸭肉厂,买猪肉找猪肉厂等等。那么调用者想吃牛肉的时候,再造一个牛肉厂就行了。

      现在调用者又有新的需求,他要买水果,比如苹果,梨子,桃子,西瓜。但是现在工厂只能生产肉,这就是工厂方法模式的问题:工厂方法模式能生产的产品是单一的

      抽象工厂的解决方法是,把产品也抽象了,产品不再是单一产品,而是一类产品,也就是产品族,现在有两个产品族,即肉类和水果类,肉类生产线有鸡肉猪肉牛肉鸭肉的具体产品,水果类生产线有苹果梨子桃子西瓜的具体产品,抽象工厂中有两个方法分别可以获取肉类和水果类的对象,具体工厂获得具体的产品对象并生产。也就是现在工厂里可以生产两种产品。

三种工厂方法的对比:

        简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

        工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   

        抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

 

abstract class AbstractFactory
{
    //生产肉的方法
    abstract public function createMeat();
    //生产水果的方法
    abstract public function createFruit();
}


/******具体工厂******/
//A工厂可生产猪肉和苹果
class AFactory extends AbstractFactory
{
    public function createMeat()
    {
        return new Pork();
    }

    public function createFruit()
    {
        return new Apple();
    }
}

//B工厂可生产鸡肉和香蕉
class BFactory extends AbstractFactory
{
    public function createMeat()
    {
        return new Chicken();
    }

    public function createFruit()
    {
        return new Banana();
    }
}


/******抽象产品******/

/*水果类产品*/
abstract class Fruit
{
    abstract public function name();//水果名
}

/******具体产品******/

/*苹果*/
class Apple extends Fruit
{
    public function name()
    {
        echo 'i am apple';
    }
}

/*香蕉*/
class Banana extends Apple
{
    public function name()
    {
        echo 'i am banana';
    }
}

/*肉类产品*/
abstract class Meat
{
    abstract public function name();
}

class Pork extends Meat
{
    public function name()
    {
        echo 'i am pork';
    }
}

class Chicken extends Meat
{
    public function name()
    {
        echo 'i am chicken';
    }
}

/******测试代码******/

//1、我们来到A工厂
$AFactory = new AFactory();

//2、告诉工厂,帮我们造一个苹果
$apple = $AFactory->createFruit();

//3、我们得到了一个苹果,可以使用它
$apple->name();//输出i am apple

//4、再去造一个猪肉
$pork = $AFactory->createMeat();
$pork->name(); //输出i am pork


        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值