工厂方法模式指的是生成式设计模式。
该模式描述了用于创建特定类的对象的接口的创建。看起来很简单,对吧?
理论上
假设我们正在开发一个使用 AR 眼镜的框架,当将头倾斜到一侧时,可用应用程序的菜单应该出现在用户的眼前。应用程序将由第三方公司(我们框架的客户)开发。自然,我们不知道应该出现哪些应用程序、图标、名称,因此我们必须提供一个接口来实现应用程序的图标和相关信息。我们称之为产品:
protocol Product {
var name: String { get }
var image: Image { get }
var executablePath: String { get }
}
接下来,我们需要提供一个接口,以便我们的客户可以为其特定产品实施一系列应用程序的发布。带有名称的应用程序图标数组,我们已经在框架中绘制了它们。
让我们编写这个接口– Creator 接口包含返回产品数组的工厂方法。
protocol Creator {
func factoryMethod() -> [Product]
}
实践
我们 AR 框架的第一个客户是 7B 公司。洪都拉斯领先的咖啡机软件供应商。他们希望销售增强现实眼镜,能够冲泡咖啡、检查水/咖啡豆是否已满,并使用室内地图模式显示前往最近咖啡机的路线。
他们负责软件的开发;我们只需提供有关Creator和Product界面的文档,以便正确显示应用程序列表及其进一步内容发射。
传输文档后,7B公司利用Creator接口,实现了Specific Creator……返回应用程序图标数组的类。图标应用程序本身是实现Product接口的特定产品类。
特定产品的示例代码:
class CoffeeMachineLocator: implements Product {
let name = “7B Coffee Machine Locator v.3000”
let image = Image.atPath(“images/locator.tga”)
let executablePath = “CoffeeMachineLocator.wasm”
}
class iPuchinno: implements Product {
let name = “iPuchinno 1.0.3”
let image = Image.atPath(“images/puchino.pvrtc”)
let executablePath = “neutron/ipuchBugFixFinalNoFreezeFixAlpha4.js”
}
类Concrete Creator,给出两个应用程序的数组:
class 7BAppsCreator: implements Creator {
func factoryMethod() -> [Product] {
return [CoffeeMachineLocator(), iPuchinno()]
}
}
此后,7B公司编译了Concrete Products、Concrete Creator库,并将其与我们的框架相结合,开始为其咖啡机销售AR眼镜,我们不需要添加。
来源
https://refactoring.guru/ru/design-patterns/command
https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612
