PHP设计模式-工厂设计模式

PHP设计模式-工厂设计模式

简介

工厂模式,如其名称一样,就是一个工厂,用于创建产品。使用工厂模式的好处就是请求者只需要发出请求,具体的实例化过程交给工厂模式,省去了new的过程。并且如果后期开发,类名发生变化,只需要调整工厂模式中一行new相关代码,不需要修改一大堆代码。

简要写法

最简单的工厂模式,实际上就是一个switch case结构,通过传入的类名,实例化相应的类。例如:

class DBFactory
{
    static function make($db_name)
    {
        switch ($db_name) {
            case 'MySQL':
                return 'MySQL';
            case 'SQL Server':
                return 'SQL Server';
            default:
                return 'Nothing';
        }
    }
}
echo DBFactory::make('MySQL');

这样假设,新增了数据库支持,可以直接修改make方法即可,另外如果MySQL类被修改为Mariadb(都差不多), 不需要调整echo DBFactory::make('MySQL');,只需要修改工厂类中的case 'MySQL': return 'Mariadb';
连接数据库经常使用的就是PDO

public function __construct ($dsn, $username, $passwd, $options)

这是PDO的构造函数,通过对$dsn参数的判断就可以连接不同的数据库。但是对上一层来说,就和刚刚的简单实例是一样的了。

稍微复杂一点的写法

也就是不仅仅有工厂类,还有产品类,每个产品都有自己的工厂,这些工厂统一继承自工厂的抽象基类(接口也行),而这些产品也统一继承工厂的抽象基类(或者实现接口)。这样创建产品以后可以直接调用产品的相关方法,而不是返回实例。

<?php
abstract class Factory
{
    protected abstract function make();

    public function doMake()
    {
        return $this->make();
    }
}

class TextFactory extends Factory
{
    protected function make()
    {
        $product =  new TextProduct();
        return $product->show();
    }
}

class ImgFactory extends Factory
{
    protected function make()
    {
        $product =  new ImgProduct();
        return $product->show();
    }
}

interface Product
{
    public function show();
}

class TextProduct implements Product
{
    public function show()
    {
        echo 'TEXT';
    }
}

class ImgProduct implements Product
{
    public function show()
    {
        echo 'IMG';
    }
}

$tf = new TextFactory();
$tf->domake();

$if = new ImgFactory();
$if->domake();

这么写有一个好处,假如我的文本和图像产品,输出格式需要修改,只需要修改echo就好,其余部分不需要修改。

参数化工厂-代码提示

<?php
class Factory
{
    private  $product = null;
    public function make(Product $product)
    {
        $this->product = $product;
        return $this->product->show();
    }
}

interface Product
{
    public function show();
}

class TextProduct implements Product
{
    public function show()
    {
        echo 'TEXT';
    }
}

$tf = new Factory();
$tf->make(new TextProduct);

这样写,我的类只要实现了Product接口,就能自动的加入工厂类中,不用担心如何调用show方法。

分类

目前大家说的比较多的三种方式
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式

抽象工厂模式

也就是Factory类提供多个make方法,这些多个make方法应该是相关或者相互依赖的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gscsdlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值