iOS 工厂模式

1 何为工厂模式?

工厂方法也称为虚构造器。它适用于一个类无法预期需要生成那个类的对象,想让子类来指定所生成的对象。

这里写图片描述
     抽象的Product(产品)定义了工厂方法创建的对象的接中。ConcreteProduct实现了Product的接口。Create定义了返回Product对象的工厂方法。它也可以为工厂方法定义一个默认实现,返回默认ConcreateProduct对象。Creator的其他操作可以调用此工厂方法创建Product对象。ConcreateCreator是Creator的子类。他重载了工厂方法,已返回ConcreteProduct的实例  选自《iOS设计模式 51页》

个人理解就是:父类定义一个创建对象的接口,让子类去决定实例化那个一个类,把对象的实例化延迟到了子类,感觉也就是和多态差不多的。

2 何时使用工厂方法?

编译时无法准确预期要创建的对象的类。
类想让其子类决定的运行时创建什么
类有若干辅助类为其子类,而你想将返回那个子类这一信息局部化

现在有点雨里雾里的,只能用例子来拨开迷雾了。这里借用别人的一个例子。

@iOS中工厂方法的简单实现举个例子,有一家生产衣服的工厂,它生产2种型号的衣服,一个为DOTA类,一个为LOL类,经销商需要进什么类型的货一定要显示的告诉工厂,生产指定的类型,这样很麻烦,后来它有钱了,开了两家工厂,一家单独生产DOTA类,一家单独生产LOL类,这样,经销商进货直接去找对应的工厂就行.

衣服的父类

HMTClothes.h
@interface HMTClothes : NSObject
- (void)showClothesType;
@end
HMTClothes.m
@implementation HMTClothes
- (void)showClothesType{
}
@end

DOTA衣服类继承与衣服类

HMTClothes_Dota.h
@interface HMTClothes_Dota : HMTClothes
- (void)showClothesType;
@end
HMTClothes_Dota.m
@implementation HMTClothes_Dota

- (void)showClothesType{
    NSLog(@"这衣服的类型是Dota");
}
@end

LOL类必须继承与同一个父类

HMTClothes_LOL.h
@interface HMTClothes_LOL : HMTClothes

- (void)showClothesType;
@end
@implementation HMTClothes_LOL

- (void)showClothesType{
    NSLog(@"这件衣服的类型是LOL");
}

@end

工厂类,通过这个类决定是Dota衣服的工厂类还是LOL衣服的类

HMTClothesFactory.h
@class HMTClothes;

@interface HMTClothesFactory : NSObject

- (HMTClothes *)makeClothes;
@end
@implementation HMTClothesFactory

- (HMTClothes *)makeClothes{

    return nil;
}

@end

HMTClothesDotaFactory Dota类,通过这类返回相对应的衣服类

HMTClothesDotaFactory.h
@interface HMTClothesDotaFactory : HMTClothesFactory
- (HMTClothes *)makeClothes;
@end
@implementation HMTClothesDotaFactory

- (HMTClothes *)makeClothes{
 
    return [[HMTClothes_Dota alloc]init];
}

@end
HMTClothesLoLFactory.h
@interface HMTClothesLoLFactory : HMTClothesFactory

- (HMTClothes *)makeClothes;

@end
@implementation HMTClothesLoLFactory

- (HMTClothes *)makeClothes{
  return [[HMTClothes_LOL alloc]init];
}

@end

VC中:

- (void)viewDidLoad {
    [super viewDidLoad];
    HMTClothesFactory *colthesFacory = [[HMTClothesDotaFactory alloc]init];
    //返回的是HMTClothesDotaFactory的对象,因为OC是运行时语言,它只有运行时才去决定哪个类。也就是多态。
    HMTClothes *clotehs = [colthesFacory makeClothes];
    [clotehs showClothesType];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言:在面向对象编程中, 最通常的方法是一个New 或者 alloc 创建要给对象实例,但是在一些情况下, new...
    LikeSomeBody阅读 3,652评论 1 2
  • 工厂模式的特点是,根据客户的要求,创建出不同的产品(也就是实例对象),而客户不需要知道产生的细节。 一、简单工厂模...
    doudo阅读 3,273评论 0 1
  • 工厂模式通过工厂模式将子类创建逻辑封装在一个方法或者说接口中,隐藏具体子类对象创建和初始化。外部只需要告诉工厂需要...
    印林泉阅读 5,020评论 4 2
  • 一. 什么是工厂模式? 工厂就是用来生产产品的,然而一个工厂不会仅仅生产一种产品,这样工厂的作用就很明显,进去的是...
    LYSNote阅读 10,165评论 0 13
  • 今天学了这篇文章《自我认知》,然后让我们分享,写简书,其实我内心是拒绝的,为什么呢?因为我自己认识的自己缺点一大堆...
    Fine婧婧阅读 1,618评论 0 0