工厂设计模式的探讨——iOS类簇的应用分析

简介: 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

工厂设计模式的探讨——iOS类簇的应用分析

一、何为设计模式

什么是设计模式,先来看段度娘的话:

      设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

其实我们不需要这么专业,在我的理解,设计模式就是一种规范化的编程习惯,养成了这样的思想与习惯,对我们的代码,总是有好处了。

二、工厂设计模式

首先,工厂设计模式是创建对象的一种设计模式,一个严格意义上的工厂设计模式应该是一个纯虚的构造方法。由子类进行具体对象的创建,我们可以这样理解:现在有一个珲少牌制造工厂,这个工厂可以制造多种交通工具,我大胆一些,假设它可以制造飞机,轮船。小汽车,公交车,出租出和自行车,那么,这些不同的车种虽然功能和大类别统一,但是他们的个体差异也是天地之别,就比如我飞机一小时可以飞5000公里,自行车拼死了劲也不一定能骑20公里。所以,如果珲少这个大工厂要生产他们,也不可能把他们放在一起生产。一个比较明智的决定是,开立分厂,比如珲少飞机工厂专门生产飞机,珲少自行车工厂专门生产自行车。

好了,如果将我们这种人类世界的思维运用于程序世界,那么我们可以通过工厂的这种思维方式来将一些大类抽象为工厂,通过定义接口或者说是定义虚函数来规范这个大工厂的生产规模和流程,由其子类来具体实现这些方法,也就是由一个个小的分厂来明确的生产我们需要的东西。这就是工厂设计模式的基本思路。

三、工厂的设计模式有什么用

许多开发者或许并不在意设计模式这个东西,我们可能会想,我实现我的功能就可以了,你管我怎么设计呢。在这篇博客的开头就说到,在我理解中,设计模式就是一种编程习惯和规范,更是一种众多开发者摸索出来的经验,这就像农业上的套种间种和你随便种,哪一种效率高,收成好,不言而喻。那么在软件设计中,工厂模式的应用在哪呢?

我们先来体验一下在iOS开发中,一些使用工厂设计模式的系统类为我们带来的便捷之处:

1、认识一个名词 类簇

在iOS的Foundation框架中,类簇是一种常用的设计模式,他将一些相近的,私有的,具体的子类组合在一个实体的抽象类下面,我称这个抽象类为实体的,是因为和我们交互的接口承载者,就是这个抽象大类。我们平时常用的三大类,NSString,NSArray,NSDictionary都是类簇,我们通过他们创建的对象都是其子类对象的实例化,并不是他本身的实例化,我们还通过上面的例子来理解,我买了一辆珲少小汽车,这两汽车的生产实际是在珲少汽车工厂生产的,但是我个人会依然认为,这是珲少工厂出产的汽车。我们可以通过打印类名来验证:

NSString * str = [[NSString alloc]initWithCString:"2" encoding:0];
    NSLog(@"%@",[str class]);

结果如下:

可以看到,真实的对象是NSString的子类__NSCFString进行实例化的。

2.这样设计的优势在哪

如果你通过NSString的事例还是无法体会到类簇,也就是工厂设计模式的优势,那么下面这个例子你一定经常遇到:NSNumber。我们在创建数字对象的时候,通常会这样考虑,如果是int值,我需要一个IntNumber的类,float值,我需要一个FloatNumber类,如果foundation框架真这么设计的话,那么你现在就痛苦了,你不仅要记住好多这样相似的类,调用方法时也要相应的对象调其内的方法,这使开发者的开发变得更加繁琐,并且对于开发者来说,我并不需要知道具体我创建了什么类,我只是想让他完成既定的方法。说的更通俗一点,还是上面的制造工厂,使用者并不在乎具体这个交通工具是哪个地方生产出来的,只要它价钱和速度都是使用者预期的结果就好了。

3.工厂设计模式的应用

通过上面的分析,我们大致可以总结出工厂这种设计模式的应用场景:

(1)当一个类并不知道要创建的具体对象是什么,交由子类处理

(2)当一些类有相似的行为和结构,只是具体实现不同时,可以抽象出工厂

(3)使用者并不在乎具体类型,只在乎接口约定的行为,并且这种行为有个体差异

四、在iOS中模拟一个工厂

同样是上面的例子,我们来用代码模拟一下:

首先,我们创建一个抽象的工程类,在其中创建一些私有的子类:

#import <Foundation/Foundation.h>
//交通工具的枚举
typedef enum {
car,
boat,
airport,
bycicle,
bus,
taxi
}ToolsName;
//代理

@protocol TransPortationDelegate <NSObject>

-(void)toHome:(Class)class;

@end
//抽象工厂类

@interface TramsPortationFactory : NSObject
+(TramsPortationFactory*)buyTool:(ToolsName)tool;
//共有的方法接口

-(int)shouldPayMoney;
-(void)run;
@property(nonatomic,strong)id<TransPortationDelegate>delegate;
@end
//具体实现的子类
@interface CarFactory : TramsPortationFactory

@end
@interface BoatFactory : TramsPortationFactory

@end
@interface AirportFactory : TramsPortationFactory

@end
@interface BycicleFactory : TramsPortationFactory

@end
@interface TaxiFactory : TramsPortationFactory

@end
@interface BusFactory : TramsPortationFactory

@end

实现文件如下:

#import "TramsPortationFactory.h"

@implementation TramsPortationFactory
//实现的创建方法
+(TramsPortationFactory*)buyTool:(ToolsName)tool{
    switch (tool) {
        case car:
            return [[CarFactory alloc]init];
            break;
        case airport:
            return [[AirportFactory alloc]init];
            break;
        case bycicle:
            return [[BycicleFactory alloc]init];
            break;
        case boat:
            return [[BoatFactory alloc]init];
            break;
        case taxi:
            return [[TaxiFactory alloc]init];
            break;
        case bus:
            return [[BusFactory alloc]init];
            break;
        default:
            break;
    }
}

-(int)shouldPayMoney{
    return 0;
}
-(void)run{
    [self.delegate toHome:[self class]];
}
@end
//各自类实现具体的行为
@implementation CarFactory
-(int)shouldPayMoney{
    return 50;
}
-(void)run{
    [super run];
    NSLog(@"car to home");
}
@end
@implementation AirportFactory
-(int)shouldPayMoney{
    return 1000;
}
-(void)run{
    [super run];
    NSLog(@"fly to home");
}
@end
@implementation BoatFactory
-(int)shouldPayMoney{
    return 300;
}
-(void)run{
    [super run];
    NSLog(@"boat to home");
}
@end
@implementation BusFactory
-(int)shouldPayMoney{
    return 10;
}
-(void)run{
    [super run];
    NSLog(@"bus to home");
}
@end
@implementation BycicleFactory
-(int)shouldPayMoney{
    return 0;
}
-(void)run{
    [super run];
    NSLog(@"run to home");
}
@end
@implementation TaxiFactory
-(int)shouldPayMoney{
    return 100;
}
-(void)run{
    [super run];
    NSLog(@"go to home");
}
@end

这样,我们的一个生产工厂就完成了,在外面,我们只需要知道一个类,我们的抽象父类,就可以实现个子类的行为,示例如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    TramsPortationFactory * tool = [TramsPortationFactory buyTool:car];
    tool.delegate=self;
    [tool run];
    NSLog(@"花了:%d钱",[tool shouldPayMoney]);
    TramsPortationFactory * tool2 = [TramsPortationFactory buyTool:airport];
    tool2.delegate=self;
    [tool2 run];
    NSLog(@"花了:%d钱",[tool2 shouldPayMoney]);
    
    
}
-(void)toHome:(Class)class{
    NSLog(@"%@",NSStringFromClass(class));
}

可以看到,对于开发者,我们并不知晓CarFactory类的存在,我们只需要通过TramsPortationFactory类,就能够操作各种交通工具,达到我们的需求。

专注技术,热爱生活,交流技术,也做朋友。
目录
相关文章
|
27天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
108 4
|
19天前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
26 8
|
23天前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
30 1
|
26天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
29 2
|
29天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
29 2
|
1月前
|
设计模式 监控 算法
Python编程中的设计模式应用与实践感悟###
在Python这片广阔的编程疆域中,设计模式如同导航的灯塔,指引着开发者穿越复杂性的迷雾,构建出既高效又易于维护的代码结构。本文基于个人实践经验,深入探讨了几种核心设计模式在Python项目中的应用策略与实现细节,旨在为读者揭示这些模式背后的思想如何转化为提升软件质量的实际力量。通过具体案例分析,展现了设计模式在解决实际问题中的独特魅力,鼓励开发者在日常编码中积极采纳并灵活运用这些宝贵的经验总结。 ###
|
1月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
23天前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践感悟####
本文作为一篇技术性文章,旨在深入探讨Python编程中设计模式的应用价值与实践心得。在快速迭代的软件开发领域,设计模式如同导航灯塔,指引开发者构建高效、可维护的软件架构。本文将通过具体案例,展现设计模式如何在实际项目中解决复杂问题,提升代码质量,并分享个人在实践过程中的体会与感悟。 ####
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。