PHP设计模式(二)之工厂模式之简单工厂模式

作者: 温新

分类: 【设计模式】

阅读: 2611

时间: 2019-12-09 18:06:10

一、三种工厂模式

工厂模式分为三种,如下

1)简单工厂模式(Simple Factory Pattern),又称 静态工厂方法模式(Static Factory Method)
2)工厂方法模式(Factory Method Pattern),又称 多态性工厂模式(Polymorphic Factory)
3)抽象工厂模式(Abstract Factory Pattern

二、什么是简单工厂模式

简单工厂模式又称静态工厂模式,其实质是由工厂类根据传入的参数动态创建相关类的实例。
简单工厂模式不属于23种设计模式,但其设计思想经常会用到。

三、简单工厂模式的结构

Factory: 工厂角色 简单工厂模式的核心,负责所有具体产品类实例的创建
product: 抽象产品角色 所有产品角色的父类,是所有实例的公共接口
Concrete Product: 具体产品角色 继承自抽象产品角色

四、简单工厂模式的应用场景

综上三点所述,举例来说明为什么要使用简单工厂模式及其应用场景。
场景之家庭做饭
我们在家里做饭,一般有三个大步骤,分别是 准备食材、烹饪食材、上菜。
第一天,吃鱼香茄子,那我们要怎么做?
1)准备食材
2)烹饪食材
3)上菜

第二天,吃回锅肉
1)准备食材
2)烹饪食材
3)上菜
......

无论吃什么菜都需要自己不断的重复这三个步骤,自己对这些做菜的步骤一清二楚。我们把菜看作一个类,这三个步骤分别是做菜的三个方法,我们想要做菜,就要new菜的实例,调用方法一步一步的做菜。后面新增菜,依旧重复旧的三的步骤。
某天,不想做菜,要去餐馆吃饭,我们会怎么做?点菜,然后等上菜,就是这是简单。这就是简单工厂模式。

五、简单工厂模式与工厂方法模式的区别

简单工厂模式
1)工厂类负责生产少量的不同品种的产品,没有过多复杂的生产逻辑
2)消费者只需要将奶茶名告诉给工作人员

工厂方法模式
1)客户端不知道它所需要的对象的类
2) 抽象工厂类通过其子类来指定创建哪个对象

六、简单工厂模式优缺点

优点:
实例化对象,根据参数获取对应的对象,避免直接实例化,降低耦合。

缺点:
需知所有的类型,不符合设计模式的开闭原则,当类型增加,工厂也需要修改。

七、代码实现

CookInterface.php

<?php

/**
 * 烹饪菜品接口,规定做菜的步骤
 */
interface Cook
{
    // 准备食材
    public function prepareIngredients();

    // 烹饪食材
    public function cooking();

    // 上菜
    public function serving();

}

BlackBean.php

<?php
/**
 * 酸辣土豆丝
 */

class BlackBean implements Cook
{
    // 准备食材
    public function prepareIngredients()
    {
        echo '步骤一:准备食材:土豆、花椒、白醋、盐、干辣椒、葱蒜...';
    }

    // 烹饪食材
    public function cooking()
    {
        echo '步骤二:烹饪食材:土豆切丝去除淀粉,锅中水开,土豆入水10s捞出...';
    }

    // 上菜
    public function serving()
    {
        echo '步骤三:上菜:你的酸辣土豆丝来了~~';
    }   
}

Eggplant.php

<?php
/**
 * 鱼香茄子类
 */

class Eggplant implements Cook
{
    // 准备食材
    public function prepareIngredients()
    {
        echo '步骤一:准备食材:茄子、葱姜蒜、豆瓣酱、水淀粉...';
    }

    // 烹饪食材
    public function cooking()
    {
        echo '步骤二:烹饪食材:锅内放油,放入肉糜煸炒,然后下葱姜蒜、豆瓣酱一起炒香....把茄子也一起放下去煮';
    }

    // 上菜
    public function serving()
    {
        echo '步骤三:上菜:你的鱼香茄子来了~~';
    }

}

RestaurantSimpleFactory.php

<?php
/**
 * 餐厅工厂方法,生产菜品
 */
class RestaurantSimpleFactory
{
    /**
     * getProductionFood 生产菜品
     * @param  string $foodType 菜品名称
     * @return [type]           [description]
     */
    public static function getProductionFood($foodType)
    {
        switch ($foodType) {
            case 'eggplant':
                return new Eggplant();
                break;
            case 'potatoes':
                return new BlackBean();
                break;
            default:
                return '客户,菜没啦~~~';
                break;
        }
    }
}

index.php

<?php
/**
 * 上菜
 */
require_once './CookInterface.php';
require_once './RestaurantSimpleFactory.php';
require_once './BlackBean.php';
require_once './Eggplant.php';

// 鱼香茄子
$eggplantFood = RestaurantSimpleFactory::getProductionFood('eggplant');
echo $eggplantFood->prepareIngredients() . '<br>';
echo $eggplantFood->cooking() . '<br>';
echo $eggplantFood->serving();

到此,简单工厂模式完毕^_^

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2019年12月10日

请登录后再评论