设为首页 加入收藏

TOP

iOS 抽象工厂模式(一)
2017-10-13 10:29:01 】 浏览:7750
Tags:iOS 抽象 工厂 模式

iOS 抽象工厂模式


什么是抽象工厂模式

简单了解一下

按照惯例,我们先了解一下什么是抽象工厂模式。抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种设计模式。抽象工厂模式,也叫做Kit模式,提供了创建一系列相关抽象子类的接口,而无需指定它们具体的类型。

抽象工厂模式中定义了抽象工厂类,抽象工厂类中定义了每个系列的抽象子类创建所需的方法,这些方法对应着不同类型的抽象子类实例化过程。每个工厂子类都对应着一个系列,工厂子类通过重写这些方法来实例化当前系列的抽象子类。

工厂方法模式中抽象子类都是基于同一个抽象类的,是同一个类型的抽象子类,例如加、减、乘、除都属于运算类型。而抽象工厂模式可能会有多个类型的抽象类,抽象子类分别继承自对应类型的抽象类,相同类型的抽象子类都是属于不同系列的。

抽象工厂模式包含四部分:

  • 抽象工厂类:定义创建抽象子类的具体行为,根据系列中不同类型的抽象子类可能会有多种行为。
  • 工厂子类:继承自抽象工厂类,根据当前抽象子类对应的系列,重写父类定义的对应行为。对应的抽象子类系列不同,行为的实现方式也不同。
  • 抽象类:定义当前类型抽象子类的操作,子类继承父类完成具体的操作。在抽象工厂模式中,可能会有多种抽象类的定义。
  • 抽象子类:根据当前类型继承自对应的抽象类,并根据系列的不同重写抽象类定义的实现。

我打算先讲一个例子

我们上面讲了系列的概念,这里将会用一个例子来理解系列和抽象类的关系。假设现在需要用Sqlite和CoreData两种不同的方式进行本地持久化,持久化的内容都是用户信息、搜索信息、设置信息三部分。

就拿Sqlite持久化方式来说,Sqlite就是使用Sqlite数据库持久化方式的系列,下面对应着用户信息、搜索信息、设置信息三个类型,每个类型就是一个抽象类。除了Sqlite这种持久化方式外,还有CoreData这种持久化方式,这是两个不同的持久化方式,所以属于两个不同的系列。

Sqlite和CoreData都代表着不同的系列,其下面都分别对应着用户信息、搜索信息、设置信息三个类型的层级,在这种层级关系中,Sqlite的用户信息抽象子类对应着CoreData的用户信息抽象子类,这两个抽象子类都属于同一个类型,继承自同一个抽象类,分别被不同系列的工厂子类创建。在抽象设计模式中,不同系列相同类型的抽象子类都是一一对应的。

Sqlite和CoreData属于不同的系列,所以是两个不同的工厂子类,这两个工厂子类具有相同的行为,就是用户信息、搜索信息、设置信息三部分的数据持久化,这就是三种不同的持久化类型,也就是我们上面说的类型。这三个行为定义在抽象工厂类中,抽象工厂类中定义每个系列的抽象子类创建方法,Sqlite和CoreData继承自抽象工厂类,并分别实现继承过来的抽象子类创建方法。

通过上面的例子,我们可以清晰的理解工厂类、抽象类、系列三者之间的关系,理解这三者的关系可以有助于我们更好的理解抽象设计模式。

和工厂方法模式有什么不同?

在工厂方法模式中,工厂子类负责抽象子类的实例化,每个工厂子类对应着一个抽象子类,且具有唯一性。而在抽象工厂模式中,一个工厂子类代表一个系列,工厂子类根据当前系列对不同类型的抽象子类进行创建。工厂方法模式中工厂子类对应的是一个类型的抽象子类,抽象工厂模式对应的是一个系列的抽象子类。

工厂方法模式一个工厂子类对应一个抽象子类的设计,会有很大的浪费,产生了过多的类。而抽象工厂模式更好的利用了工厂子类,使每个工厂子类对应着一个系列的抽象子类,这种设计非常适用于两个具有相同结构关系,但是分属于不同系列的系列之间的切换。

总之就是,工厂方法模式是针对单个类型的抽象类,而抽象工厂模式是针对具有相同结构的一系列类型的抽象类。

业务场景

在上面讲到了数据持久化的例子,我们的业务场景也根据上面的例子提出。

在iOS中比较常用的数据持久化方案,应该就包括Sqlite和CoreData了,可能Sqlite的灵活性使其更加受欢迎。业务就是需要用Sqlite和CoreData两种不同的方式进行本地持久化,持久化的内容是用户信息、搜索信息、设置信息三部分。

通过抽象工厂模式实现上面的需求,可以很方便的进行本地持久化方案的切换,下面的例子中将会演示一行代码切换数据持久化方案的例子。

UML类图

我们根据上面的业务场景画了一个UML类图,下面类图中为了让大家看得更清晰,所以用不同颜色的线区分开了对应的类和功能。

下面的黑色箭头是抽象子类和抽象类的继承关系;红色是用户工厂子类对应的抽象子类;黄色是搜索工厂子类对应的抽象子类;绿色是设置工厂子类对应的抽象子类。

抽象工厂模式

在这个UML类图中,我们可以清晰的看出,之前工厂方法模式的工厂子类对应的是单一类型的抽象子类,上面抽象工厂模式的工厂子类对应的是同一系列多个类型的抽象子类,更好的利用了工厂子类,适合更加复杂的业务需求。抽象工厂类的方法定义也和工厂方法模式不太一样,由于工厂方法模式只创建一个抽象子类,所以直接用的类方法定义,抽象方法模式可能会创建多个类型的抽象子类,所以用的实例方法定义。

普通方式代码实现

这里代码实现按照上面举的例子,代码结构也完全按照上面UML类图中画的结构,使整篇文章可以更加统一,更深刻的理解这个设计模式。

代码量比较多,但是为了更好的体现出抽象工厂模式,所以就全贴出来了。

首先创建两个Model类,这两个Model类并不属于抽象工厂模式结构的一部分,只是为了更好的体现出面向模型开发。

//.h
@interface User : NSObject
@property (nonatomic, copy  ) NSString  *userName;
@property (nonatomic, assign) NSInteger userAge;
@end
//.m
@implementation User
@end
//.h 
@interface City : NSObject
@property (nonatomic, copy) NSString *cityName;
@property (nonatomic, copy) NSString *cityCode;
@end
//.m
@implementation City
@end

用户信息系列相关类

//.h
@interface UserInfo : NSObject
- (void)setUserName:(User *)name;
@end
//.m
@implementation UserInfo
- (void)setUserName:(User *)name {}
@end
 //.h
@interface SqliteUserInfo : UserInfo
@end
//.m
@implementation SqliteUserInfo
- (void)setUserName:(User *)name {
    NSLog(@"这里编写数据库持久化方案");
}
@end
 //.h
@interface CoreDataUserInfo : UserInfo
@end
//.m
@imp
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【Swift学习】Swift编程之旅---属.. 下一篇自定义tableViewCell

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目