介绍

抽象工厂模式也可以叫为产品族模式,因为它是负责一个套餐的生产。比如一个硬件代工厂要生产 Mac 的鼠标和键盘,然后又接到了华为的鼠标和键盘生成需求。因为华为和 Mac 是两个不同的公司,所以他们的产品外观,性能也有不同要求。然后将这些组合起来一起,就形成了一个产品族。

项目结构

image-20210413163431312

UML

代码

Mouse.php

1
2
3
4
5
6
7
<?php


interface Mouse
{
public function click();
}

Keyboard.php

1
2
3
4
5
6
7
<?php


interface Keyboard
{
public function input();
}

Factory.php

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


interface Factory
{
public function createMouse();

public function createKeyboard();
}

WinKeyboard.php

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


class WinKeyboard implements Keyboard
{

public function input()
{
return 'win keyboard input';
}
}

WinMouse.php

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


class WinMouse implements Mouse
{

public function click()
{
return 'win mouse click';
}
}

MacKeyboard.php

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


class MacKeyboard implements Keyboard
{

public function input()
{
return 'mac keyboard input';
}
}

MacMouse.php

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


class MacMouse implements Mouse
{

public function click()
{
return 'mac mouse click';
}
}

WinFactory.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php


class WinFactory implements Factory
{

public function createMouse()
{
return new WinMouse();
}

public function createKeyboard()
{
return new WinKeyboard();
}
}

MacFactory.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php


class MacFactory implements Factory
{

public function createKeyboard()
{
return new MacKeyboard();
}

public function createMouse()
{
return new MacMouse();
}
}

总结

抽象工厂模式与工厂方法模式非常类似,抽象工厂模式更多的是将工程类接口变耦合了,所以要想改变产品的 等级结构 是非常麻烦的,但是扩展产品族却非常容易。

  • 增加产品族:对于增加新的产品族,工厂方法模式很好的支持了“开闭原则”,对于新增加的产品族,只需要对应增加一个新的具体工厂即可,对已有代码无须做任何修改。

  • 增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,违背了“开闭原则”。