iOS工厂模式

iOS工厂模式

文章目录

  • iOS工厂模式
    • [简单工厂模式(Simple Factory)](#简单工厂模式(Simple Factory))
    • [工厂方法模式(Factory Method)](#工厂方法模式(Factory Method))
    • [抽象工厂模式(Abstract Factory)](#抽象工厂模式(Abstract Factory))
    • 三种模式对比

简单工厂模式(Simple Factory)

定义:通过一个工厂类集中管理所有对象的创建,客户端通过传入参数指定所需产品类型。

工厂类通常包含一个静态方法(类方法),由该方法根据输入类型负责创建具体的产品(对象)。

简单的拿我项目之中内容来举例,我在地图之中标点有乡村景点和民俗之分,不同位置对应的标点显示图片不同,于是就分为不同的标点,于是我为BJAnnotation写了一个类方法

objc 复制代码
typedef enum BJAnnotationType {
    BJAnnotationTypeScenery = 0,
    BJAnnotationTypeLiving = 1
} BJAnnotationType;

+(BJyAnnotation *)AnnotationWithType:(BJAnnotationType)type {
    switch (type) {
        case BJAnnotationTypeScenery:
        		BJSceneryAnnotation *annotation = [[BJSceneryAnnotation alloc] init];
            return annotation;
        case BJAnnotationTypeLiving:
         		BJLivingAnnotation *annotation = [[BJLivingAnnotation alloc] init];
            return annotation;
        default:
           	return nil;
    }
}

其实说白了就是根据不同的情况生成了不同的类,我们可以获取所需要的对象,而不需要知道其创建细节,一定程度上减少系统的耦合

工厂方法模式(Factory Method)

定义:将对象的创建延迟到子类,每个具体工厂负责一个具体产品的实例化。

  1. 抽象工厂接口 :声明创建产品的抽象方法(如 sellPhone方法)
  2. 具体工厂类 :实现接口,返回特定产品实例(如 XiaomiFactory 创建小米手机)
  3. 产品继承体系:与简单工厂模式类似,但工厂与产品一一对应

在OC之中,我们其实可以使用协议来实现一个工厂类的抽象方法,类似内容如下

objc 复制代码
@protocol PhoneMakeProtocol <NSObject>
 + (phone *)sellPhone; // 这个phone可以作为抽象类(小米,苹果手机都继承于他)
 @end

建立一个具体的工厂类

objc 复制代码
 @interface iPhoneFactory : NSObject <PhoneMakeProtocol>
 @end
  
 @implementation iPhoneFactory
 - (phone *)sellPhone {
     return [[iPhone alloc] init];
 }
 @end

抽象工厂模式(Abstract Factory)

定义:创建一组相关或依赖对象的家族(产品族),确保产品之间的兼容性。

工厂模式是创建型设计模式的核心类型之一,其核心目标是将对象的创建与使用解耦,提升系统的扩展性和可维护性。根据创建逻辑的抽象层级不同,工厂模式可分为以下三种类型:三、抽象工厂模式(Abstract Factory)

说白了,其实就是这个工厂能够实现更多的协议,我们在原先的工厂类之中添加一个协议方法,让其可以生产computer, 我们可以在同个协议之中定义多个方法,也可以利用协议多继承的性质

objc 复制代码
//协议之中定义多个方法
@protocol PoductMakeProtocol <NSObject>
 + (phone *)sellPhone; 
 + (computer *)sellComputer; 
 @end

//多继承
@protocol PhoneMakeProtocol <NSObject>
 - (phone *)sellPhone; 
 @end
 
@protocol ComputerMakeProtocol <NSObject>
 - (computer *)sellComputer; 
 @end
 
 

工厂实例

objc 复制代码
 @interface iPhoneFactory : NSObject <PhoneMakeProtocol>
 @end
  
 @implementation iPhoneFactory
  - (phone *)sellPhone {
     return [[iPhone alloc] init];
 }
 - (computer *)sellComputer {
   return [[Mac alloc] init];
}
 @end

优点

  • 保证产品族内对象的一致性(如同一品牌的汽车部件)
  • 支持横向扩展(新增产品族无需修改现有代码)

缺点

  • 扩展新产品类型需修改抽象工厂接口,灵活性较低

三种模式对比

维度 简单工厂 工厂方法 抽象工厂
核心目标 集中创建单一产品 子类化扩展单一产品 创建关联产品族
扩展性 差(需修改工厂类) 高(新增工厂类) 中(新增产品族)
适用场景 简单、固定类型 动态扩展单一产品类型 多维度关联产品
典型应用 工具类生成器 支付方式扩展 跨平台 UI 组件
  1. 演进逻辑

    • 简单工厂 → 工厂方法:从硬编码参数到多态扩展,解决开闭原则问题
    • 工厂方法 → 抽象工厂:从单一产品到产品族的抽象,提升系统一致性
  2. 选择原则

    • 若产品类型单一且稳定,优先使用简单工厂
    • 若需灵活扩展独立产品,选择工厂方法
    • 若需管理多个关联产品,采用抽象工厂
相关推荐
遇乐的果园14 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
遇乐的果园16 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_16 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
可乐奶茶sky16 小时前
AI Agent 学习
人工智能·学习
茯苓gao17 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
RD_daoyi19 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
chase。19 小时前
【学习笔记】PointWorld:迈向通用机器人操控的3D世界模型
笔记·学习·机器人
ZZH_AI项目交付19 小时前
同一套前摄心率算法,为什么 iPhone 16 Pro 稳,iPhone XR 会失准?
ios·app·ai编程
AOwhisky20 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
DeMinds20 小时前
内容没有丢,我为什么总在重新整理?|DeMinds 如何让工作接着继续
ios·github·markdown