iOS中的计划模式(三)- 工厂方法

[复制链接]
发表于 2025-11-6 14:10:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

弁言

险些在每个用面向对象语言开发的应用步调中,都能见到工厂方法模式的身影。它是 抽象工厂模式 的核心构成部分。通过重载抽象工厂父类中界说的工厂方法,各种具体工厂可以大概创建属于本身的对象。
在工厂方法模式中,生产者 本身并不愿定是抽象工厂,它可以是恣意类。关键在于不直接创建对象实例,而是通过工厂方法创建对象,并以抽象范例返回。这种计划使得代码对具体类的依靠低沉,便于扩展和维护。
什么是工厂方法

工厂方法也称为假造构造器。它实用于这种环境:一个类无法渔区必要天生谁人范例的对象,像让其子类来指定所天生的对象。

抽象的Product界说了工厂方法创建的对象的接口。而实际的产物ConcreteProduct实现了Product接口。Creator界说了返回Product对象的工厂方法。它也可以为工厂方法界说一个默认的实现。返回一个默认的ConcrereProduct对象。Creator的别的操纵可以调用此工程方法来创建Product对象。ConcrereCreator是Creator的子类。它重载了工厂方法,以返回ConcreteProduct的实例。
工厂方法的最初界说就是专注于让子类决定创建什么对象。
什么时间利用工厂方法

工厂方法模式特殊恰当以了局景:

  • 当类不知道必要实例化的具体对象时(比方,利用协议或基类体现的对象)。
  • 必要将对象的创建逻辑与利用逻辑解耦时(比方,在网络层或数据分析层)。
  • 必要支持多种对象范例,而且范例会随需求变革时。
与简朴工厂模式相比,工厂方法提供了更大的机动性;与抽象工厂模式相比,它更关注单个对象的创建逻辑而非一组对象。
通过工厂方法模式,你的代码将可以大概以更高的可扩展性和机动性应对变革,为复杂应用提供强盛的支持。
怎样利用工厂方法

我们以实际开发中适配深色模式和淡色模式为例, 这个场景非常恰当创建多个具体的工厂。每个模式都可以有本身独特的风格和组件。我们可以通过每个工厂为特定模式创建适配的UI组件。
具体代码如下:
起首是界说组件的接口(Product)。
  1. protocol ThemeComponent {
  2.     func render()
  3. }
复制代码
接着我们来界说具体的组件,他们必要依照ThemeComponent并实现ThemeComponent中界说的方法。
  1. class LightButton: ThemeComponent {
  2.     func render() {
  3.         print("Rendering a light-themed button.")
  4.     }
  5. }
  6. class DarkButton: ThemeComponent {
  7.     func render() {
  8.         print("Rendering a dark-themed button.")
  9.     }
  10. }
  11. class LightTextField: ThemeComponent {
  12.     func render() {
  13.         print("Rendering a light-themed text field.")
  14.     }
  15. }
  16. class DarkTextField: ThemeComponent {
  17.     func render() {
  18.         print("Rendering a dark-themed text field.")
  19.     }
  20. }
复制代码
接下来我们必要界说工厂接口(Creator),来创建产物。
  1. protocol ThemeFactory {
  2.     func createButton() -> ThemeComponent
  3.     func createTextField() -> ThemeComponent
  4. }
复制代码
末了依照Creator来界说具体的工厂(ConcreteCreator),创建具体的产物。
  1. class LightThemeFactory: ThemeFactory {
  2.     func createButton() -> ThemeComponent {
  3.         return LightButton()
  4.     }
  5.     func createTextField() -> ThemeComponent {
  6.         return LightTextField()
  7.     }
  8. }
  9. class DarkThemeFactory: ThemeFactory {
  10.     func createButton() -> ThemeComponent {
  11.         return DarkButton()
  12.     }
  13.     func createTextField() -> ThemeComponent {
  14.         return DarkTextField()
  15.     }
  16. }
复制代码
在代码中利用工厂时,只必要根据主题模式来创建差异的工厂,而创建具体组件的任务交给工厂即可。
  1. // 假设通过用户设置或系统获取主题
  2.     let isDarkMode = true
  3.     let factory: ThemeFactory = isDarkMode ? DarkThemeFactory() : LightThemeFactory()
  4.     // 使用工厂创建组件
  5.     let button = factory.createButton()
  6.     let textField = factory.createTextField()
  7.     // 渲染组件
  8.     button.render()
  9.     textField.render()
复制代码
当isDarkModel == true时:
  1. Rendering a dark-themed button.
  2. Rendering a dark-themed text field.
复制代码
当isDarkModel == false时:
  1. Rendering a light-themed button.
  2. Rendering a light-themed text field.
复制代码
工厂方法在实际项目中的利用

在多主题的应用中,通常我们都会利用到工厂方法,通过将对象的创建与利用解耦,来根据差异的需求机动地天生符合的对象。
起首界说一个主题协议,内里会界说各种颜色、图片大概是UI组件,但不必要提供实现:
  1. public protocol MWThemeProtocol  {
  2.    
  3.     /// 主题颜色
  4.     var themeColor:UIColor { get }
  5.     /// 主要容器背景颜色
  6.     var containerBgColor:UIColor { get }
  7.     /// 次要容器背景颜色
  8.     var secondaryContainerBgColor:UIColor { get }
  9.     /// 主要文字颜色
  10.     var primaryTextColor:UIColor { get }
  11. ...
  12. }
复制代码
接下来创建一个具体的工厂来服从该协议,并实现全部方法,返回该工厂指定样式的内容:
  1. public class MWThemeNormalFactory: MWThemeProtocol {
  2.     /// 主题颜色
  3.     public var themeColor: UIColor {
  4.         return UIColor.red
  5.     }
  6.     /// 主要容器背景颜色
  7.     public var containerBgColor: UIColor {
  8.         return UIColor.white
  9.     }
  10.     /// 次要容器背景颜色
  11.     public var secondaryContainerBgColor: UIColor {
  12.         return .wm_hex("#EFF1F5")
  13.     }
  14.     /// 主要文本颜色
  15.     public var primaryTextColor: UIColor {
  16.        return .wm_hex("#11111B")
  17.    }
  18.     /// 次要文本颗色
  19.     public var secondaryTextColor: UIColor {
  20.         return .wm_hex("#6C7086")
  21.     }
  22. ...
  23. }
复制代码
创建别的一个工厂,也依照该协议并实现全部方法,返回该工厂指定样式的内容:
  1. public class MWThemeDarkFactory: MWThemeProtocol {
  2.    
  3.     /// 主题颜色
  4.     public var themeColor: UIColor {
  5.         return UIColor.red
  6.     }
  7.     /// 主要容器背景颜色
  8.     public var containerBgColor: UIColor {
  9.         return .wm_hex("#11111B")
  10.     }
  11.     /// 次要容器背景颜色
  12.     public var secondaryContainerBgColor: UIColor {
  13.         return .wm_hex("#1E1E2E")
  14.     }
  15.     /// 主要文本颜色
  16.     public var primaryTextColor: UIColor {
  17.        return .wm_hex("#FFFFFF")
  18.    }
  19.     /// 次要文本颗色
  20.     public var secondaryTextColor: UIColor {
  21.         return .wm_hex("#BCC0CC")
  22.     }
  23. ...
  24. }
复制代码
一个多主题应用的重要主题体系的核心部分就构建完成了,接下来我们只必要根据差异的主题来创建差异的工厂,工厂内部会创建该主题对应的UI元素。
  1. public class MWThemeHelper: NSObject {
  2.    
  3.     /// 创建主题工厂
  4.     public static var themeFactory:MWThemeProtocol = MWThemeNormalFactory()
  5.    
  6.     /// 启动设置主题
  7.     public static func setupTheme() {
  8.         // 读取系统深色模式设置
  9.         
  10.     }
  11.    
  12.     /// 更新主题
  13.     private static func updateTheme(themeType:MWThemeType) {
  14.         switch themeType {
  15.         case .light:
  16.             themeFactory = MWThemeNormalFactory()
  17.         case .dark:
  18.             themeFactory = MWThemeDarkFactory()
  19.         }
  20.     }
  21.     ....
  22. }
复制代码
结语

在多主题的应用中,工厂方法模式显得尤为告急。通过将对象的创建与利用解耦,我们可以大概根据差异的需求和情境机动地天生符合的对象,尤其是在必要支持多个界面主题时。工厂方法不光能资助我们维持代码的清楚和扩展性,还能有用应对不停变革的需求。最告急的是,机动利用工厂方法,可以进步代码的可维护性和可重用性,从而打造更加高效和可靠的应用步调。在计划时,将工厂方法与差异的需求场景连合,可以让我们的应用更具顺应性,且易于扩展。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表