美文网首页Design Pattern
用php写工厂模式

用php写工厂模式

作者: AnnaJIAN | 来源:发表于2018-11-20 10:10 被阅读0次

简单的工厂方法。

客户通过工厂发出请求,想要创建一个产品,但是这个产品和直接请求的类不存在绑定关系。
如果实例化的子类可能发生变化,就需要用到工厂。

<?php
class transportationFactory {
    public function createBicycle(): Bicycle {
        return new Bicycle();
    }

    public function createCar(): Car {
        return new Car();
    } 
}

class Bicycle {
    public function driveTo(string $destination){ echo $destination; }
}

class Car {
    public function driveTo(string $destination){ echo $destination; }
}

$factory = new transportationFactory();
$bicycle = $factory->createBicycle();
$bicycle->driveTo('Paris');
$car = $factory->createCar();
$bicycle->driveTo('Lodon');

复杂的工厂

两个工厂有相似的功能,具体如何实现自己决定。
继承抽象类有抽象方法,由子类实现。为了保持子类统一,便于以后扩展维护方便,通常让子类继承同一个接口。
或者让其强制继承接口。

<?php
abstract class basefactory {
    protected abstract function do();

    public function sayhello() {
        return $this->do();
    }
}

Class Afactory extends basefactory {
    protected function do() {
        return (new M1)->dosomething();
    }
}

Class Bfactory extends basefactory {
    protected function do() {
        return (new M2)->dosomething();
    }

    // public function __call($methods, $args) {
    //     echo 'oops, function ' . $methods . ' doesn\'t exist in ' . __class__;
    // }
}

Interface I {
    function dosomething();
}

Class M1 implements I {
    public function dosomething() {
        echo 'I am M1';
    }
}

Class M2 implements I {
    public function dosomething() {
        echo 'I am M2';
    }
}

Class M3 implements I {
    public function dosomething() {
        echo 'I am M3';
    }
}

$a = (new Afactory)->sayhello();
$b = (new Bfactory)->sayhello();

用到工厂方法的场景

调用多种数据库类型的地方mysql/sqlserver/sqlite,数据都有connect,close,select,delete之类的封装方法。具体如何实现就由自己的sqlBuilder文件去完成了。
做一个图书资源的网站。网站包括各种学科,历史,地理,人文。每种学科呈现形式都会有video,audio,pdf;或者首页,子目录展现页,查询页,查询结果页之类的视图结果集。

相关文章

网友评论

    本文标题:用php写工厂模式

    本文链接:https://www.haomeiwen.com/subject/icazfqtx.html