PHP设计模式(二)之工厂模式之简单工厂模式
一、三种工厂模式
工厂模式分为三种,如下
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日