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