简单工厂模式

由一个工厂对象决定创建出哪一种产品类的实例

作用:

简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类

使用场景:

  • 在子类比较固定并不需要扩展时
  • 工厂类负责创建的对象比较少

3个对象

  • 抽象产品类(Vehicle\Vehicle.php):提供抽象方法供具体产品类实现
  • 具体产品类(Vehicle\Car.php、Vehicle\Bicycle.php):提供具体的产品
  • 工厂类(Factory.php):根据内部逻辑返回相应的产品

UML图:

UML-Simple-Factory

Demo

Github地址:

实现

Vehicle\Bicycle.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php

namespace App\SimpleFactory\Vehicle;

class Bicycle extends Vehicle
{

public function run()
{
return '两个轮子跑的贼慢';
}
}

Vehicle\Car.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php

namespace App\SimpleFactory\Vehicle;

class Car extends Vehicle
{

public function run()
{
return '四个轮子跑的飞起';
}
}

Vehicle\Vehicle.php

1
2
3
4
5
6
7
8
<?php

namespace App\SimpleFactory\Vehicle;

abstract class Vehicle
{
abstract public function run();
}

Factory.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

namespace App\SimpleFactory;

use App\SimpleFactory\Vehicle\Bicycle;
use App\SimpleFactory\Vehicle\Car;
use mysql_xdevapi\Exception;

class Factory
{

const CAR = 1;
const BICYCLE = 2;

public static function create($carType)
{
switch ($carType) {
case 1:
$obj = new Bicycle();
break;
case 2:
$obj = new Car();
break;
default:
throw new Exception('Unsupport');
break;
}
return $obj;
}
}

测试

TestSimpleFactory.php

1
2
3
4
5
6
7
8
9
10
<?php

namespace Test;

require __DIR__ . '/../vendor/autoload.php';

use App\SimpleFactory\Factory;

$obj = Factory::create(Factory::BICYCLE);
var_dump($obj->run());