用php写工厂模式
2018-11-20 本文已影响0人
AnnaJIAN
简单的工厂方法。
客户通过工厂发出请求,想要创建一个产品,但是这个产品和直接请求的类不存在绑定关系。
如果实例化的子类可能发生变化,就需要用到工厂。
<?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;或者首页,子目录展现页,查询页,查询结果页之类的视图结果集。