iOS设计模式--抽象工厂

抽象工厂与简单工厂最大的区别就是抽象工厂的工厂类也是抽象的。

在软件设计中,如果客户端想手工创建一个类的对象,那么客户端需要首先知道这个类的细节。更糟的是,一组相关的对象可以在运行时按不同的标准创建得不一样,此时客户端就需要知道全部细节才能创建它们。可以通过抽象工厂方法来解决这个问题。

抽象工厂提供一个固定的接口,用于创建一系列有关联或相依存的对象,而不必指定其具体类或其创建的细节。客户端与从工厂得到的具体对象之间没有耦合。下图显示了一系列工厂及其产品的可能关系。


如图所示:

Client只知道AbstractFactory和AbstractProduct。每个工厂类中,结构与实际操作的细节按黑箱对待。甚至产品也不知道谁将负责承建它们。只有具体工厂知道为客户端创建什么,如何创建。这个模式有趣的一点是,很多时候它都用简单工厂模式来实现。工厂方法把实际的创建过程推迟到重载它的子类中。在类图中,方法createProductA和createProductB是工厂方法。最初的抽象方法什么也不创建。这种抽象非常通用,广泛用于任何需要抽象创建过程的场合。抽象工厂模式常与原型模式,单例模式和享元模式等其他设计模式一起使用。

抽象工厂与简单工厂在许多方面都非常相似。很多人常常搞不清楚应该在什么时候用哪一个。两个模式都用于相同的目的:创建对象而不让客户端知晓返回了什么确切的具体对象。以下为抽象工厂与简单工厂的对比:



以下为代码演示:

首先创建一个基本的工厂类,这个工厂类里面包括两个具体的工厂类,分别可以创建手机和手表的具体工厂类

《BaseFactory》:

BaseFactory.h:

BaseFactory.m:

两个具体工厂类《AppleFactory》和《GoogleFactory》:

AppleFactory.h:

AppleFactory.m:

GoogleFactory.h:

GoogleFactory.m:

创建手机和手表的基本产品类《BasePhone》和《BaseWatch》:

BasePhone.h:

BasePhone.m:


BaseWatch.h:


BaseWatch.m:


基本产品类下面可以创建具体的产品:

《iPhone》,《Android》,《iWatch》,《Android》,具体产品类都差不多,每个产品类可以有自己的方法

iPhone.h:


iPhone.m:


其他三个类依次类推...........

最后创建一个工厂管理类《FactoryManager》,这个类的作用就是管理所有的基本工厂,用来获取创建产品的具体工厂类:

FactoryManager.h:

FactoryManager.m:

使用:

#import "ViewController.h"

#import "FactoryManager.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {   

[super viewDidLoad];      

//获取工厂 

  BaseFactory *factory = [FactoryManager factoryWithBrand:kGoogle];       

//创建产品 

BasePhone *phone = [factory createPhone];   

BaseWatch *watch = [factory createWatch];   

NSLog(@"%@ %@", phone, watch);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容