iOS工厂模式

news2025/5/23 22:59:02

iOS工厂模式

文章目录

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

简单工厂模式(Simple Factory)

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

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

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

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之中,我们其实可以使用协议来实现一个工厂类的抽象方法,类似内容如下

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

建立一个具体的工厂类

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

抽象工厂模式(Abstract Factory)

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

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

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

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

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

工厂实例

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

优点

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

缺点

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

三种模式对比

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

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

    • 若产品类型单一且稳定,优先使用简单工厂
    • 若需灵活扩展独立产品,选择工厂方法
    • 若需管理多个关联产品,采用抽象工厂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2384202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库】-1 mysql 的安装

文章目录 1、mysql数据库1.1 mysql数据库的简要介绍 2、mysql数据库的安装2.1 centos安装2.2 ubuntu安装 1、mysql数据库 1.1 mysql数据库的简要介绍 MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;目前…

物流项目第五期(运费计算实现、责任链设计模式运用)

前四期&#xff1a; 物流项目第一期&#xff08;登录业务&#xff09;-CSDN博客 物流项目第二期&#xff08;用户端登录与双token三验证&#xff09;-CSDN博客 物流项目第三期&#xff08;统一网关、工厂模式运用&#xff09;-CSDN博客 物流项目第四期&#xff08;运费模板列…

X 下载器 2.1.42 | 国外媒体下载工具 网页视频嗅探下载

X 下载器让你能够轻松地从社交应用如Facebook、Instagram、TikTok等下载视频和图片。通过内置浏览器访问网站&#xff0c;它能自动检测视频和图片&#xff0c;只需点击下载按钮即可完成下载。去除广告&#xff0c;解锁本地会员&#xff0c;享受无广告打扰的下载体验。 大小&am…

STM32 CAN CANAerospace

STM32的CAN模块对接CANAerospace 刚开始报错如下. 设备开机后整个CAN消息就不发了. USB_CAN调试器报错如下. index time Name ID Type Format Len Data00000001 000.000.000 Event 总线错误 DATA STANDARD 8 接收过程错误-格…

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取

1 简介 为了有效地利用雾状冰生长的物理现象&#xff0c;最近开发了一种优化算法——雾状优化算法&#xff08;RIME&#xff09;。它模拟硬雾状和软雾状过程&#xff0c;构建硬雾状穿刺和软雾状搜索机制。在本研究中&#xff0c;引入了一种增强版本&#xff0c;称为修改的RIME…

服务器安装xfce桌面环境并通过浏览器操控

最近需要运行某个浏览器的脚本&#xff0c;但是服务器没有桌面环境&#xff0c;无法使用&#xff0c;遂找到了KasmVNC&#xff0c;并配合xfce实现低占用的桌面环境&#xff0c;可以直接使用浏览器进行操作 本文基于雨云——新一代云服务提供商的Debian11服务器操作&#xff0c;…

Oracle 创建外部表

找别人要一下数据&#xff0c;但是他发来一个 xxx.csv 文件&#xff0c;怎么办&#xff1f; 1、使用视图化工具导入 使用导入工具导入&#xff0c;如 DBeaver&#xff0c;右击要导入的表&#xff0c;选择导入数据。 选择对应的 csv 文件&#xff0c;下一步就行了&#xff08;如…

大语言模型 17 - MCP Model Context Protocol 介绍对比分析 基本环境配置

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…

【软考向】Chapter 9 数据库技术基础

基本概念数据库的三级模式结构 数据模型E-R 模型关系模型各种键完整性约束 关系代数5 种基本的关系代数运算&#xff1a;并、差、笛卡儿积、投影和选择扩展的关系代数运算&#xff1a;交(Intersection)、连接(Join)、除(Division)、广义投影(Generalized Projection)、外连接(O…

实战:Dify智能体+Java=自动化运营工具!

我们在运营某个圈子的时候&#xff0c;可能每天都要将这个圈子的“热门新闻”发送到朋友圈或聊天群里&#xff0c;但依靠传统的实现手段非常耗时耗力&#xff0c;我们通常要先收集热门新闻&#xff0c;再组装要新闻内容&#xff0c;再根据内容设计海报等。 那怎么才能简化并高…

STM32单片机GUI系统1 GUI基本内容

目录 一、GUI简介 1、emWin 2、LVGL (Light and Versatile Graphics Library) 3、TouchGFX 4、Qt for Embedded 5、特性对比总结 二、LVGL移植要求 三、优化LVGL运行效果方法 四、LVGL系统文件 一、GUI简介 在嵌入式系统中&#xff0c;emWin、LVGL、TouchGFX 和 Qt 是…

应届本科生简历制作指南

一、找一个专业的简历模板 首先&#xff0c;你需要访问 Overleaf 的官方网站&#xff0c;也就是Overleaf, Online LaTeX Editor&#xff0c;进入页面后&#xff0c;点击注册按钮&#xff0c;按照提示填写相关信息来创建一个属于自己的账号&#xff0c;通常需要填写用户名、邮箱…

PyTorch可视化工具——使用Visdom进行深度学习可视化

文章目录 前置环境Visdom安装并启动VisdomVisdom图形APIVisdom静态更新API详解通用参数说明使用示例Visdom动态更新API详解1. 使用updateappend参数2. ~~使用vis.updateTrace方法~~3. 完整训练监控示例 Visdom可视化操作散点图plot.scatter()散点图案例线性图vis.line()vis.lin…

企业级爬虫进阶开发指南

企业级爬虫进阶开发指南 一、分布式任务调度系统的深度设计 1.1 架构设计原理 图表 1.2 核心代码实现与注释 分布式锁服务 # distributed_lock.py import redis import timeclass DistributedLock:def __init__(self, redis_conn):self.redis = redis_connself.lock_key = …

网络安全-等级保护(等保) 2-7 GB/T 25058—2019 《信息安全技术 网络安全等级保护实施指南》-2019-08-30发布【现行】

################################################################################ GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》包含安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管理制度、安全管理机构、安全管理人员、安…

数据结构实验10.1:内部排序的基本运算

文章目录 一&#xff0c;实验目的二&#xff0c;实验内容1. 数据生成与初始化2. 排序算法实现&#xff08;1&#xff09;直接插入排序&#xff08;2&#xff09;二分插入排序&#xff08;3&#xff09;希尔排序&#xff08;4&#xff09;冒泡排序&#xff08;5&#xff09;快速…

wps编辑技巧

1、编辑模式 2、图片提取方法&#xff1a;右键保存图片 可以直接右键保存下来看看是否是原始图&#xff0c;如果歪着的图&#xff0c;可能保存下来是正的&#xff0c;直接保存试下 3、加批注

开放世界RPG:无缝地图与动态任务的拓扑学架构

目录 开放世界RPG:无缝地图与动态任务的拓扑学架构引言第一章 地图分块系统1.1 动态加载算法1.2 内存管理模型第二章 任务拓扑网络2.1 任务依赖图2.2 动态可达性分析第三章 NPC行为系统3.1 行为森林架构3.2 日程规划算法第四章 动态事件系统4.1 事件传播模型4.2 玩家影响指标第…

【图像处理入门】1. 数字图像的本质:从像素到色彩模型

作为图像处理的开篇&#xff0c;本文将带你拆解数字图像的底层逻辑&#xff1a;从模拟图像到数字信号的神奇转换&#xff0c;到像素世界的微观构成&#xff0c;再到彩色图像的编码奥秘。通过 Python 代码实战&#xff0c;你将亲手触摸图像的 “基因”—— 像素值&#xff0c;并…

(已解决:基于WSL2技术)Windows11家庭中文版(win11家庭版)如何配置和使用Docker Desktop

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a; 解决方法&#xff1a; 1、使用WSL2技术&#xff08;亲测有效&#xff09; 注意&#xff1a; 2、开启Hyper-V功能&#xff08;未经亲测&#xff0c;待研究&#xff09; 问题现象&#xff1a; 今天想在本…