查理和工厂方法模式

在阅读有关“设计模式”或“设计原理”的文档时,我发现大多数情况下创建示例都是非常简单的,足以理解其本质。 这种方法的不便之处在于,很多时候您看不到它所解释的内容的真实应用。 而且,因此,您很难知道如何在现实生活中遇到实际问题时应用这些原理和模式。

前几天,我开始开发Apple TV天气应用程序,以练习Swift并学习如何为tvOS平台开发应用程序。 使其变得更有趣和新颖的想法是让用户从已实施的气象服务列表中选择气象服务提供商。

从一开始,我就意识到这是一个很好的示例,用于解释Factory Method Pattern的工作方式以及如何在Swift中实现它。

从维基百科:

在基于类的编程中, 工厂方法模式是一种创建模式,该模式使用工厂方法来处理创建对象的问题,而不必指定将要创建的对象的确切类。

一个真实的例子

第一步将是在工厂方法中指定要创建的对象的接口,在本例中为Weather Service。 我们还需要一种方法,该方法将为完成的城市及其所在国家/地区在完成处理程序中返回带有天气预报的Weather结构。

在这一点上,我们可以创建自己想要的,符合该协议的任意数量的服务。 例如,我们可以创建实现以从“开放天气地图”和“世界天气在线”服务中提供天气预报(GitHub仓库中的完整实现):

最后一步是创建工厂本身:

现在,每次我们想要添加新服务时,我们都必须:

  1. 创建它并实现WeatherServiceProtocol
  2. 枚举中添加一个case,并在开关的相应case中返回其实例化

因此,当我们要使用气象服务时,可以按以下步骤进行:

现在,当用户选择其他服务时,我们只需要用新的服务枚举 case替换.WorldWeather

包起来

我们已经实现了一个工厂方法模式的示例来创建气象服务对象,而不必指定将要创建的对象的确切类。 我们通过使用一个非常重要的设计原则来实现这一目标:“编程为接口,而不是实现。”在这种情况下,通过编程为WeatherServiceProtocol而不是不同的具体实现。

设计模式是一般性想法,没有一种实现每个想法的独特方法。 在Swift中可能有不同甚至更干净的方法来实现此模式,在这种情况下,我很想知道它。 因此,不要犹豫,发表自己的想法。

资源:

您可以在以下GitHub存储库中找到WeatherTV项目的代码:https://github.com/dadederk/WeatherTV

Swift 2设计模式->第1章:创建模式->工厂方法模式:http://www.amazon.co.uk/gp/product/1785887610/ref=as_li_tl?ie=UTF8&camp=1634&creative=19450&linkCode=as2