论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
移动端开发
›
IOS
›
iOS--工厂设计模式
iOS--工厂设计模式
泉缘泉
金牌会员
|
2024-6-10 02:44:57
|
来自手机
|
显示全部楼层
|
阅读模式
楼主
主题
788
|
帖子
788
|
积分
2374
设计模式的概念和意义
设计模式(Design Patterns)是一套被反复使用、代码设计经验的总结,一般与编程语言无关,是一套比较成熟的编程头脑。它重要解决的是在软件设计中反复出现的问题,并提供了一种解决方案。这些方案是在恒久软件开辟实践中逐步形成的,旨在提高代码的可重用性、可维护性和可扩展性。
在iOS开辟中,设计模式通常与面向对象编程(OOP)的概念相联合,通过类和对象来形貌问题域中的事物及其关系。设计模式将最佳实践封装成可复用的代码片断,使开辟者能够更快速、更高效地构建高质量的应用步伐。
设计模式的意义
代码重用性:设计模式提供了一种标准化的方式来构造代码,使得类似的解决方案可以在不同的项目中被重用。这淘汰了开辟职员的工作量,提高了代码的质量。
提高代码可读性:设计模式依照肯定的命名和结构规范,使得代码更加清晰易懂。其他开辟者可以更轻易地理解代码的目的和功能,从而加快项目的开辟进度。
保证代码可靠性:设计模式经过恒久实践的检验,已经被证实是有效的解决方案。使用设计模式可以降低代码出错的大概性,提高应用步伐的稳定性。
降低维护成本:设计模式使得代码结构更加清晰,易于维护和扩展。当须要修改或添加新功能时,开辟职员可以更轻易地找到相关的代码并举行修改。
促进团队协作:设计模式为开辟职员提供了一种共同的语言和框架,使得团队成员之间可以更轻易地互换和协作。这有助于提高项目的整体质量和效率。
类族模式
在之前的学习中,我们了解到了类族模式;这里的工厂设计模式和类族模式很像 ;
UIButton作为类族模式的例子
抽象基类:UIButton是抽象基类,它定义了按钮的根本属性和举动。开辟者通常不会直接创建UIButton的实例,而是通过调用其类方法来创建特定范例的按钮实例。
详细子类:固然开辟者无法直接访问或看到UIButton的详细子类,但体系框架中确实存在多个私有子类来实现不同范例的按钮。这些子类根据按钮的范例(如体系按钮、自定义按钮等)和样式(如平凡按钮、高亮按钮、禁用按钮等)举行不同的绘制和举动处理。
创建按钮实例:
开辟者通过调用UIButton的类方法(如buttonWithType:)来创建按钮实例。该方法根据传入的范例参数(如UIButtonTypeSystem、UIButtonTypeRoundedRect等)返回不同子类的实例。
在下面的代码中,我们调用buttonWithType:方法并传入UIButtonTypeSystem作为参数来创建一个体系范例的按钮。然后,我们设置按钮的标题、添加点击事件的处理方法,并将其添加到视图中。
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"Click Me" forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
复制代码
隐蔽实现细节
作为开辟者,我们无需关心UIButton背后详细是由哪个子类实现的。我们只须要使用UIButton提供的公共接口来设置按钮的属性、添加事件处理方法等。体系框架会根据我们的需求主动选择并创建符合的子类实例。
总结
通过类族模式,UIButton能够隐蔽其背后的实现细节,提供同一的公共接供词开辟者使用。这简化了开辟过程,提高了代码的可读性和可维护性。同时,由于体系框架内部可以根据须要动态选择并创建不同的子类实例,因此也提高了代码的机动性和可扩展性。
三种工厂设计模式
工厂设计模式重要分为以下三种,每种模式都有其特定的应用场景和优缺点:
简朴工厂模式(Simple Factory Pattern):
又称为静态工厂方法模式(Static Factory Method Pattern)。
通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。不过其实可以使用协议;
特点:代码简朴,虽有多处if分支且违反开闭原则(对扩睁开放,对修改关闭),但扩展性和可读性尚可,如许的代码在大多数情况下并无问题。
代码实例
上面创建了一个专门的工厂类来创建产物类,来实现隐蔽产物类的创建实现,其产物类都依照operation协议并展示接口,但终极只有工厂类的类方法袒露在外被人调用 ;
工厂方法模式(Factory Method Pattern):
定义一个创建产物对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产物的创建,如许核心类成为一个抽象工厂脚色,仅负责详细工厂子类必须实现的接口。
特点:通过不同的工厂创建不同的对象,每个对象都有自己的工厂来创建。当对象的创建过程比较复杂,须要组合其他类对象做各种初始化使用时,保举使用工厂方法模式。
代码实例
创建一个抽象类ShapeFactory作为核心工厂类,该类依照CreateFactory协议中声明的接口 ;
#import <Foundation/Foundation.h>
#import "CreateFactory.h"
NS_ASSUME_NONNULL_BEGIN
@interface ShapeFactory : NSObject <CreateFactory>
@end
NS_ASSUME_NONNULL_END
复制代码
由该抽象工厂类调用接口创建详细的产物工厂类 ;再由详细的产物工厂类创建产物对象 ;
#import "ShapeFactory.h"
NS_ASSUME_NONNULL_BEGIN
@interface Factory01 : ShapeFactory
- (id <Shape>)createProduct ;
@end
NS_ASSUME_NONNULL_END
复制代码
#import "Factory01.h"
#import "Product01.h"
@implementation Factory01
- (id <Shape> )createProduct {
return [[Product01 alloc] init];
}
@end
复制代码
抽象工厂模式(
Abstract Factory Pattern):
是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
提供了一种创建对象的最佳方式,当须要创建一组相关或互相依靠的对象时,抽象工厂模式非常有效。
特点:工厂方法模式中固然解决了简朴工厂模式中须要修改已有代码的问题,但当详细的产物种类变多时,就会出现大量的和他们对应的详细工厂类对象。抽象工厂模式是工厂方法模式的升级版,它用来创建一组相关大概互相依靠的对象。
代码实例
起首定义两个产物类 ;依照并实现一个display接口 ;
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol display <NSObject>
- (void)display ;
@end
NS_ASSUME_NONNULL_END
复制代码
#import <Foundation/Foundation.h>
#import "display.h"
NS_ASSUME_NONNULL_BEGIN
@interface FstButton : NSObject <display>
- (void)display ;
@end
NS_ASSUME_NONNULL_END
//
#import "FstButton.h"
@implementation FstButton
- (void)display {
NSLog(@"1") ;
}
@end
复制代码
#import <Foundation/Foundation.h>
#import "display.h"
NS_ASSUME_NONNULL_BEGIN
@interface SedButton : NSObject <display>
- (void)display ;
@end
NS_ASSUME_NONNULL_END
//
#import "SedButton.h"
@implementation SedButton
- (void)display {
NSLog(@"2") ;
}
@end
复制代码
定义两个产物的详细工厂类;它们依照并实现协议中定义的createProduct接口 ;
#import <Foundation/Foundation.h>
#import "display.h"
NS_ASSUME_NONNULL_BEGIN
@protocol CreateProduct <NSObject>
- (id <display>) createProduct ;
@end
NS_ASSUME_NONNULL_END
复制代码
#import <Foundation/Foundation.h>
#import "CreateProduct.h"
#import "FstButton.h"
NS_ASSUME_NONNULL_BEGIN
@interface FstFactory : NSObject <CreateProduct>
- (id <display>) createProduct ;
@end
NS_ASSUME_NONNULL_END
//
#import "FstFactory.h"
@implementation FstFactory
- (id <display>) createProduct {
return [[FstButton alloc] init];
}
@end
复制代码
#import <Foundation/Foundation.h>
#import "CreateProduct.h"
#import "SedButton.h"
NS_ASSUME_NONNULL_BEGIN
@interface SedFactory : NSObject <CreateProduct>
- (id <display>) createProduct ;
@end
NS_ASSUME_NONNULL_END
//
#import "SedFactory.h"
@implementation SedFactory
- (id <display>)createProduct {
return [[SedButton alloc] init];
}
@end
复制代码
定义一个超级工厂类来创建详细工厂类
#import <Foundation/Foundation.h>
#import "FstFactory.h"
#import "SedFactory.h"
NS_ASSUME_NONNULL_BEGIN
@interface BaseFactory : NSObject
+ (id <CreateProduct>) createFactory : (NSString*) type ;
@end
NS_ASSUME_NONNULL_END
//
#import "BaseFactory.h"
@implementation BaseFactory
+ (id <CreateProduct>) createFactory:(NSString *)type {
if ([type isEqualToString:@"1"]) {
return [[FstFactory alloc] init] ;
} else if ([type isEqualToString:@"2"]) {
return [[SedFactory alloc] init] ;
} else {
return nil;
}
}
@end
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
泉缘泉
金牌会员
这个人很懒什么都没写!
楼主热帖
华为一镜到底主题__荣耀30系列安装教程 ...
日志模块
「Docker入门指北」容器很难理解?带你 ...
数据资产为王,如何解析企业数字化转型 ...
信创环境下分布式文件存储MinIO集群部 ...
28基于java的简单酒店数据管理 ...
Vulnhub之M87靶机详细测试过程(不同提 ...
面试题百日百刷-HBase中HTable API有没 ...
解决NuGet加载或下载资源慢的问题 ...
MYSQL(进阶篇)——一篇文章带你深入 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表