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

来源:互联网 发布:微信开发必须80端口 编辑:程序博客网 时间:2024/06/05 18:52

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参数的判断就可以连接不同的数据库。但是对上一层来说,就和刚刚的简单实例是一样的了。

稍微复杂一点的写法

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

<?phpabstract 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就好,其余部分不需要修改。

参数化工厂-代码提示

<?phpclass 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方法应该是相关或者相互依赖的。

原创粉丝点击