iOS 工厂模式

原创 2016年08月30日 14:56:15

一、GOF是这样描述工厂模式的:

“Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.”

在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。

“专门定义一个类来负责创建其他类的实例,被创建的实例常常具有共同的父类。”

实际上就是由一个工厂类,根据传入的参数,动态的决定创建出哪一个产品类的实例。

工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好地符合了开放封闭原则。工厂方法也叫做虚构造器(Virtual Constructor).

二、什么时候使用工厂方法?


三、iOS中工厂方法的简单实现

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

#import <Foundation/Foundation.h>

@interface HMTClothes : NSObject

//  展示衣服类型
- (void)showClothesType;												       @end

#import "HMTClothes.h"

@implementation HMTClothes
- (void)showClothesType{
}
@end

#import "HMTClothes.h"

@interface HMTClothes_Dota : HMTClothes

- (void)showClothesType;

@end

#import "HMTClothes_Dota.h"

@implementation HMTClothes_Dota

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

#import "HMTClothes.h"

@interface HMTClothes_LOL : HMTClothes

- (void)showClothesType;

@end

#import "HMTClothes_LOL.h"

@implementation HMTClothes_LOL

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

@end


#import <Foundation/Foundation.h>

@class HMTClothes;
@interface HMTClothesFactory : NSObject

- (HMTClothes *)makeClothes;

@end

#import "HMTClothesFactory.h"

@implementation HMTClothesFactory

- (HMTClothes *)makeClothes{
  return nil;
}
@end

#import "HMTClothesFactory.h"

@interface HMTClothesDotaFactory : HMTClothesFactory

- (HMTClothes *)makeClothes;

@end

#import "HMTClothesDotaFactory.h"
#import "HMTClothes_Dota.h"

@implementation HMTClothesDotaFactory

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

#import "HMTClothesFactory.h"

@interface HMTClothesLOLFactory : HMTClothesFactory

- (HMTClothes *)makeClothes;

@end

#import "HMTClothesLOLFactory.h"
#import "HMTClothes_LOL.h"
@implementation HMTClothesLOLFactory

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


- (void)viewDidLoad{
  [super viewDidLoad];
  
  /**
   *  实例变量的类型,是由进行了alloc的Class决定的,一般也就是等号的右边
   *  就好比,NSMutableArray * mutableArray = 一个类型为NSArray的数组;它的实质还是一个NSArray类型,并
   *  不能调用NSMutableArray的方法
   */
  HMTClothesFactory *clothesFactory = [[HMTClothesDotaFactory alloc] init];
  HMTClothes *clothes = [clothesFactory makeClothes];
  [clothes showClothesType];  //  -->输出的是"这件衣服的类型是Dota"
  //  如果你想制造LOL衣服,直接把HMTClothesDotaFactory->HMTClothesLOLFactory即可
 }

通过以上的结构图和代码可知,简单工厂模式主要有三种角色,分别是工厂角色、抽象产品角色和具体产品角色。

  1. 工厂类角色:简单工厂模式的核心,负责根据传入的参数来实例化具体的产品实例。
  2. 抽象产品角色:通常是工厂产生具体类的父类(或者是具体类实现的接口)。
  3. 具体产品角色:简单工厂模式所创建的任何对象都是这个角色的实例。

优缺点                        

  从上面的介绍可以看出,简单工厂模式的优点是客户端可以直接消费产品,而不必关心具体产品的实现,消除了客户端直接创建产品对象的责任,实现了对责任的分割。

  缺点是工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响,而且当产品类别多结构复杂的时候,把所有创建工作放进一个工厂来,会使后期程序的扩展较为困难。

  通过优缺点的分析,我们可以在如下场景下使用简单工厂模式:

  1. 工厂类负责创建的对象比较少时;
  2. 客户端只知道传入工厂类的参数,对于如何创建对象的逻辑不必关心时。
版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 设计模式之工厂模式

工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一般是alloc一个对象,如果需要创建100个这样的对象,如果是在一个for循环中还好说,直接一句alloc就行了,但是事实并不那么如意,...
  • xiazailushang
  • xiazailushang
  • 2014年02月10日 18:05
  • 35095

iOS 21种设计模式之工厂模式

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow感谢感谢《Pro Objective-C ...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年12月04日 12:12
  • 2288

iOS 21种设计模式之抽象工厂(Abstract Factory)

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow感谢感谢《Pro Objective-C ...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年12月07日 10:13
  • 2082

【iOS开发】类簇--抽象工厂模式在OC中的使用

简介 Class Clusters(类簇)是抽象工厂模式在iOS下的一种实现,众多常用类,如NSString、NSArray、NSDictionary以及NSNumber都运作在这一模式下,它是接口...
  • a316212802
  • a316212802
  • 2016年01月14日 00:09
  • 1546

iOS 简单工厂模式、抽象工厂模式~详解

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 /**     注意:简单工厂模式示例代码下载地址, */ 一、简单工厂模式 1、简述 首先...
  • shihuboke
  • shihuboke
  • 2017年06月29日 17:59
  • 259

Objective-C:初始化、实例方法、类方法、工厂方法、单例模式

初始化 无参初始化 1.1 init是从父类NSObject中继承的,所以不需要在.h文件中声明 带参初始化 2.1 方法名的格式为:-(id)initWith… 2.2 instancetyp...
  • cz_zol
  • cz_zol
  • 2016年08月24日 21:01
  • 598

iOS之Cell工厂解决多种cell的困扰

在开发过程中经常遇到tabView中包含多种样式的cell,这里介绍一种cell工厂模式  下面示例中含有示图的三种cell 1. 创建model基类BaseModel...
  • cj_app
  • cj_app
  • 2016年01月22日 20:51
  • 3304

iOS设计模式 - (3)简单工厂模式

http://www.2cto.com/kf/201402/280586.html 1 前言 我们总说面向对象要有可维护性,可扩展性,可复用性。今天我们就来学习一种简单地设计模式--简单工厂...
  • jeffasd
  • jeffasd
  • 2016年05月27日 09:35
  • 278

ios开发中的基本设计模式(代理,观察者,MVC,单例,策略,工厂,MVVM,原型,Target-Action,通知(notification)机制)

(一)代理模式
 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。
 优势:解耦合
敏捷原则:开放-封闭原则
实例:tableview的 数据源delegate,通...
  • BaiHuaXiu123
  • BaiHuaXiu123
  • 2016年03月12日 20:37
  • 1995

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一...
  • jason0539
  • jason0539
  • 2014年04月07日 17:36
  • 222206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)