抽象工厂与简单工厂最大的区别就是抽象工厂的工厂类也是抽象的。
在软件设计中,如果客户端想手工创建一个类的对象,那么客户端需要首先知道这个类的细节。更糟的是,一组相关的对象可以在运行时按不同的标准创建得不一样,此时客户端就需要知道全部细节才能创建它们。可以通过抽象工厂方法来解决这个问题。
抽象工厂提供一个固定的接口,用于创建一系列有关联或相依存的对象,而不必指定其具体类或其创建的细节。客户端与从工厂得到的具体对象之间没有耦合。下图显示了一系列工厂及其产品的可能关系。
如图所示:
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);
}