PHP 设计模式之工厂模式

发布 : 2019-06-10 分类 : PHP 浏览 :

1. 简单工厂模式

模式定义:简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,之所以可以这么说,是因为简单工厂模式是通过一个静态方法来创建对象的。它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

代码分析:

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
31
32
33
34
35
36
37
interface animals // 抽象产品角色
{
public function animal();
}
class Cat implements animals // 具体产品角色
{
public function animal()
{
return "猫猫";
}
}
class Dog implements animals // 具体产品角色
{
public function animal()
{
return "狗狗";
}
}
class Factory // 工厂角色
{
public static function createAnimal($param)
{
$result = null;
switch($param)
{
case 'cat':
$result = new Cat();
break;
case 'dog':
$result = new Dog();
break;
}
return $result;
}
}
echo Factory::createAnimal("cat")->animal(); // 猫猫
echo Factory::createAnimal("dog")->animal(); // 狗狗

2. 工厂方法模式

模式定义:工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

代码分析:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
abstract class animals // 抽象产品类
{
abstract public function animal();
}
class Cat extends animals // 具体产品类
{
public function animal()
{
return "猫猫";
}
}
class Dog extends animals // 具体产品类
{
public function animal()
{
return "狗狗";
}
}
interface Factory // 抽象工厂类, 将对象的创建抽象成一个接口
{
public function create();
}
class CatFactory implements Factory // 继承工厂类, 用于实例化产品
{
public function create()
{
return new Cat();
}
}
class DogFactory implements Factory // 继承工厂类, 用于实例化产品
{
public function create()
{
return new Dog();
}
}

class Client // 具体操作类
{
public function test()
{
$catResult = new CatFactory();
echo $catResult->create()->animal();

$DogResult = new DogFactory();
echo $DogResult->create()->animal();
}
}

$lala = new Client();
$lala->test(); // 猫猫狗狗

3. 抽象工厂模式

模式定义:抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

代码解析:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
interface AnimalsFactory // 抽象工厂
{
public function createCat(); // 生产一尾猫
public function createDog(); // 生产一头狗 -_-
}

abstract class Cat // 猫抽象
{
abstract function getCat();
}
class ForeignCat extends Cat // 猫具体
{
public function getCat()
{
return "外国布偶猫".PHP_EOL;
}
}
class ChineseCat extends Cat
{
public function getCat()
{
return "华夏猫".PHP_EOL;
}
}

abstract class Dog
{
abstract function getDog();
}
class ChineseDog extends Dog
{
public function getDog()
{
return "中华国犬".PHP_EOL;
}
}
class ForeignDog extends Dog
{
public function getDog()
{
return "外国哈士奇".PHP_EOL;
}
}

class CreateChineseAnimalFactory implements AnimalsFactory
{
public function createCat()
{
return new ChineseCat();
}
public function createDog()
{
return new ChineseDog();
}
}
class CreateForeignAnimalFactory implements AnimalsFactory
{
public function createCat()
{
return new ForeignCat();
}
public function createDog()
{
return new ForeignDog();
}
}

$result = new CreateForeignAnimalFactory();
$ForeignCat = $result->createCat();
echo $ForeignCat->getCat(); // 布偶猫

$ForeignDog = $result->createDog();
echo $ForeignDog->getDog(); // 哈士奇

PHP_EOL 为PHP换行符。

区别

  • 简单工厂模式(静态方法工厂模式) : 用来生产同一等级结构中的任意产品。(不能增加新的产品)
  • 工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
  • 抽象工厂 :用来生产不同产品种类的全部产品。(不能增加新的产品,支持增加产品种类)

结语

使用工厂模式的好时机并不总是显而易见的。不要强制这样做,只有在构建复杂系统时才需要进行大量的抽象。你只要知道什么是抽象工厂,迟早你会发现一个真正的用例。happy day!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹