美文网首页iOS2021面试
iOS-设计模式-工厂方法

iOS-设计模式-工厂方法

作者: 骑毛驴的小强 | 来源:发表于2017-01-11 00:39 被阅读206次

下面来聊聊设计模式中的工厂模式,它又分为(工厂方法,简单工厂,抽象工厂),那么这3种又有什么区别呢,来,聊个5毛钱的。工厂模式是利用了面向对象3大特性之一——多态,父类指针指向子类对象这个特性。父类定义方法,子类实现。

一、工厂方法

第三方集成是iOS必备的一个技能吧,比如说,支付,地图。我们就拿地图说事吧,集成了百度地图,后面要改成高德地图。一般为了方便就把代码耦合在项目中了,虽然说代码量是很少,维护起来是很方便,但是我们要学的是思想。像下面这种把一些初始化方法放在didFinishLaunchingWithOptions中,第三方集成多了显得臃肿,代码难看。

- (BOOL)application:(UIApplication *)application   
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

   _mapManager = [[BMKMapManager alloc]init];   
   [_mapManager start:@"在此处输入您的授权Key"  generalDelegate:nil];  
   return YES;  
}

1>分析,发现百度地图BMKMapView是继承的UIView,高德地图MAMapView也是继承了UIView,是不是可以做文章了???

@interface BMKMapView : UIView
@interface MAMapView : UIView

接下来就用工厂方法来处理地图,一行代码切换地图。首先我们先定义一个父类IMapFactory,定义其方法。

.h文件
#import <UIKit/UIKit.h>

@interface IMapFactory : UIView
- (id)getMapFactoryWithFrame:(CGRect)frame;
@end

.m文件
#import "IMapFactory.h"

@implementation IMapFactory

- (id)getMapFactoryWithFrame:(CGRect)frame {
    return nil;
}
@end

2>创建两个子类BaiduMapFactory和GaodeMapFactory继承IMapFactory,在子类中实现其父类的方法。

- (id)getMapFactoryWithFrame:(CGRect)frame {
    
    _mapManager = [[BMKMapManager alloc] init];
    [_mapManager start:@"HBnGpGicUfd6SwSr5oCMre3asI29U0GG" generalDelegate:nil];
    
    _mapView = [[BMKMapView alloc] initWithFrame:frame];
    return _mapView;
}

这里可以将百度地图的初始化代码写在这里,瘦身didFinishLaunchingWithOptions这个程序入口,程序设计有一个很好的原则,我需要用你,你内部怎么定义的我不管,我只管用。高德地图也是一样实现父类的方法。
3>接下来终于要用到了地图这个功能了。

IMapFactory *mapFactory = [[BaiduMapFactory alloc] getMapFactoryWithFrame:self.view.bounds];
 [self.view addSubview:mapFactory];

你没有看错2行代码就能实现地图功能,以后要修改地图,直接将BaiduMapFactory 换成GaodeMapFactory即可。
4>工厂方法总结:定义一个用于创建对象的接口,是由子类决定实例化那种对象。与父类无关。

二、简单工厂

简单工厂相比工厂方法父类多了一些逻辑的判断,父类根据一些条件作出相应的判断来取出子类。,客户端给工厂基类条件,基类通过判断来实例化对应的子类。

 IMapFactory *mapFactory = [[IMapFactory alloc] getMapFactoryWithFrame:self.view.bounds type:baidu];
 [self.view addSubview:mapFactory];

基类的条件判断

#import "IMapFactory.h"
#import "BaiduMapFactory.h"
#import "GaodeMapFactory.h"

@implementation IMapFactory

- (id)getMapFactoryWithFrame:(CGRect)frame type:(mapType)type {

    if (type == baidu) {
        
        return [[BaiduMapFactory alloc] getMapFactoryWithFrame:frame type:type];
    } else {
    
        return [[GaodeMapFactory alloc] getMapFactoryWithFrame:frame type:type];
    }
}
@end

优点:在客户端,就可以不用导入子类的头文件了,所有的操作都是客户端通过条件,让基类自己来实例化子对象。

相关文章

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 设计模式之简单工厂、工厂方法、抽象工厂

    设计模式之简单工厂、工厂方法、抽象工厂 什么是设计模式? 设计模式(Design pattern)代表了最佳的实践...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 大话设计模式之_工厂模式

    大话设计模式之_工厂模式 工程方法(即简单工厂模式simpleFactory,或静态工厂方法 static fac...

  • spring 设计模式篇(前)

    设计模式俗称:套路 一、spring常见设计模式 (23种设计模式) 创建型:工厂方法模式、抽象工厂模式、建造者...

  • iOS-设计模式-工厂方法

    下面来聊聊设计模式中的工厂模式,它又分为(工厂方法,简单工厂,抽象工厂),那么这3种又有什么区别呢,来,聊个5毛钱...

  • 设计模式(六)抽象工厂模式

    导读:前文设计模式(五)工厂方法模式介绍了工厂方法模式,本篇开始介绍抽象工厂模式,继续优化工厂方法模式,更好的满足...

  • 简单工厂模式

    Android进阶之设计模式 简单工厂模式 简单工厂模式(又叫作静态工厂方法模式), 其属于创建型设计模式,但并不...

网友评论

    本文标题:iOS-设计模式-工厂方法

    本文链接:https://www.haomeiwen.com/subject/adzkbttx.html