介绍

为了更好的管理创建对象,我们通常使用工厂模式

new 对象的话,一旦代码有变化或者拓展,就必须改变原来的代码,也就是说你的代码不 “ 对修改关闭 ”

设计原则之一:对扩展开放,对修改关闭

② 解耦,便于更新和维护

栗子

项目目录

UML 图

代码

Mouse.php

1
2
3
4
5
6
7
<?php


interface Mouse
{
public function click();
}

WinMouse.php

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


class WinMouse implements Mouse
{
public function click()
{
return 'win mouse click';
}
}

MacMouse.php

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


class MacMouse implements Mouse
{
public function click()
{
return 'mac mouse click';
}
}

SimpleFactory.php

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


class SimpleFactory
{
public function create($type)
{
switch ($type)
{
case 'win':
return new WinMouse();
case 'mac':
return new MacMouse();
}

throw new \RuntimeException('创建鼠标失败');
}
}

总结

简单工厂模式将具体创建流程隐蔽起来,明确了各自的职责和权利。然而出现第三种类型鼠标,那么就要修改简单工厂类逻辑。这样子就违背了对修改关闭的原则。

简单工厂模式第一眼看起来和策略模式非常像,其中的区别就是策略更关注行为,Centext 类是用来切换策略来执行对应逻辑的。而简单工厂就只是创建一个工厂对象而已。