工厂模式

| 选择喜欢的代码风格  

工厂模式


最常用的设计模式就是工厂模式。在这个模式下,需要一个用来创建你需要的对象的类。基本的工厂类:

//要创建对象实例的类
class MyObject{
  
}

//工厂类
class MyFactory{
	public static function factory(){
	return new MyObject():
   }
}
 
$instance=MyFactory::factory();

考虑下面的工厂模式的例子:

<?php
class Automobile
{
    private $vehicleMake;
    private $vehicleModel;

    public function __construct($make, $model)
    {
        $this->vehicleMake = $make;
        $this->vehicleModel = $model;
    }

    public function getMakeAndModel()
    {
        return $this->vehicleMake . ' ' . $this->vehicleModel;
    }
}

class AutomobileFactory
{
    public static function create($make, $model)
    {
        return new Automobile($make, $model);
    }
}

// 用工厂的 create 方法创建 Automobile 对象
$veyron = AutomobileFactory::create('Bugatti', 'Veyron');

print_r($veyron->getMakeAndModel()); // outputs "Bugatti Veyron"

上面的代码用来一个工厂来创建 Automobile 对象。用这种方式创建对象有两个好处:

  1. 首先,如果你后续需要更改,重命名或替换 Automobile 类,你只需要更改工厂类中的代码,而不是在每一个用到 Automobile 类的地方修改;
  2. 其次,如果创建对象的过程很复杂,你也只需要在工厂类中写,而不是在每个创建实例的地方重复地写。

当然,用工厂模式并不总是必要(或者明智)。上面的示例代码很简单,在实践中,工厂类中会被加入一些不必要的复杂性。 如果你是在做一个很大很复杂的项目,使用工厂模式将会给你省去很多麻烦。

最后,一定要记得,工厂类静态方法返回一个对象。不是两个,更不是三个


PHP 工厂模式扩展阅读:


为什么使用工厂模式?


设计模式本身就有其适用的场景,并不是滥用的,否则还不如不用。

首先,工厂模式是为了解耦:把对象的创建和使用的过程分开。就是 Class A 想调用 Class B ,那么A只是调用B的方法,而至于B的实例化,就交给工厂类。

其次,工厂模式可以降低代码重复。如果创建对象B的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。我们可以这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的创建过程的修改维护。

由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要找到所有需要创建B的地方去逐个修正,只需要在工厂里修改即可,降低维护成本。同理,想把所有调用B的地方改成B的子类B1,只需要在对应生产B的工厂中或者工厂的方法中修改其生产的对象为B1即可,而不需要找到所有的 new B() 改为 new B1()

另外,因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。

举个例子:


一个数据库工厂:可以返回一个数据库实例,可以是 MySql,Oracle, MS SQL Server, SQLite等。

这个工厂就可以把数据库连接需要的用户名,地址,密码等封装好,直接返回对应的数据库对象就好。不需要调用者自己初始化,减少了写错密码等等这些错误。调用者只负责使用,不需要管怎么去创建、初始化对象。



发表评论