使用工厂模式的另一个重要原因是考虑当您必须在设计和代码中添加类时代码会发生什么。
如果您不使用工厂模式,您的代码将越来越紧密地耦合,您将不得不在许多不同的地方进行更改。您必须确保您必须接触代码的每个地方都与您必须接触的所有其他(紧密耦合的)地方相协调。 测试变得非常复杂,而且有些东西会坏掉。
工厂模式为您提供了一种减少耦合的方法,并帮助您将职责封装到几个地方。使用工厂模式,添加额外的类意味着在更少的地方接触代码。简化了测试(构建测试用例以及运行测试)。
在现实世界中,大多数代码“足够”复杂,工厂模式的好处显而易见。更改、改进和扩展对象模型,在快速变化的情况下尽可能完整和严格地进行测试,并确保您的代码尽可能不死板(同时要意识到多个人将在几个月/几年的时间里一直在努力)——工厂模式通常是不费吹灰之力的。
举一个简单的例子,很难看出使用工厂模式的优势。(如果你的代码真的很琐碎,那么这种模式可能不会给你带来太多收益。)这是我在网上搜索时看到的许多示例的问题——这些示例往往侧重于“你可以确定在运行时上课!并且很简单。
这是一个不太简单的例子,我认为让人们思考该模式的所有可能好处:
Bob Tarr 的工厂模式演示文稿 (pdf)。(示例 2,从第 10 页开始。)假设您正在编写一个迷宫游戏,其中一个人必须探索迷宫和迷宫中的所有房间。您的对象模型包括一个由Doors、Rooms、Walls之类的东西组成的Maze,并且还有一个Map也必须跟踪它们。很简单。但是当你开始添加魔法房间和魔法门和魔法窗户时会发生什么?会说话的图片和曲折的小段落?你最终会得到很多类来代表一切;您要确保在添加新类时必须更改(触摸)尽可能少的代码。并且您不希望修改Map类中的代码,例如,每次添加新类时:您希望使这些类专注于它们真正应该负责的内容。
不仅要考虑在运行时实例化的内容,还要考虑代码的复杂性。
他还举了一个在 UI 组件中使用工厂模式(特别是工厂方法)的示例——工厂模式在其中出现了很多。(对于初学者,或者从未处理过 UI 代码的人,我认为这个例子不是很清楚。)
请记住,大多数编码都是在现有代码上完成的:大部分时间都花在修改已经存在的代码上。您希望确保您的代码能够在不脆弱的情况下处理更改。减少耦合和封装责任将大大有助于实现这一目标。