抽象工厂
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
工厂方法只能生产一个产品(单个产品)
抽象工厂可以一下生产一个产品族(里面有很多产品组成)
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

角色和职责
- 抽象工厂(Abstract Factory)
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。 - 具体工厂(Concrete Factory)
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象 - 抽象(AbstractProduct)
抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。 - 具体产品(ConCreteProduct)
抽象模式所创建的具体实例对象。
代码示例
#import <Foundation/Foundation.h>
//抽象产品A
@interface AbstractProductA : NSObject
- (void)anOperation;
@end
@implementation AbstractProductA
@end
//抽象产品B
@interface AbstractProductB : NSObject
- (void)anOperation;
@end
@implementation AbstractProductB
@end
//产品A
@interface AProduct : AbstractProductA
@end
@implementation AProduct
- (void)anOperation {
NSLog(@"A Product");
}
@end
//产品AA
@interface AAProduct : AbstractProductA
@end
@implementation AAProduct
- (void)anOperation {
NSLog(@"AA Product");
}
@end
//产品B
@interface BProduct : AbstractProductB
@end
@implementation BProduct
- (void)anOperation {
NSLog(@"B Product");
}
@end
//产品BB
@interface BBProduct : AbstractProductB
@end
@implementation BBProduct
- (void)anOperation {
NSLog(@"BB Product");
}
@end
//抽象工厂
@interface AbstractFactory : NSObject
- (AbstractProductA *)createProduct1;
- (AbstractProductB *)createProduct2;
@end
@implementation AbstractFactory
@end
//A工厂
@interface AFactory : AbstractFactory
@end
@implementation AFactory
- (AbstractProductA *)createProduct1 {
return [[AProduct alloc] init];
}
- (AbstractProductA *)createProduct2 {
return [[AAProduct alloc] init];
}
@end
//B工厂
@interface BFactory : AbstractFactory
@end
@implementation BFactory
- (AbstractProductB *)createProduct1 {
return [[BProduct alloc] init];
}
- (AbstractProductB *)createProduct2 {
return [[BBProduct alloc] init];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
AbstractFactory *af = nil;
af = [[AFactory alloc] init];
[[af createProduct1] anOperation];
[[af createProduct2] anOperation];
NSLog(@"生产:A、AA");
af = [[BFactory alloc] init];
[[af createProduct1] anOperation];
[[af createProduct2] anOperation];
NSLog(@"生产:B、BB");
}
return 0;
}
//输出
/*
A Product
AA Product
生产:A、AA
B Product
BB Product
生产:B、BB
*/
优点
可以一下生产一个产品族。一个工厂负责创建多个不同类型的产品。
缺点
以代码为例,抽象工厂类目前只能生产createProduct1和createProduct2,生产更多的产品的话需要修改该抽象工厂类及具体工厂类!产品线是写死的!
网友评论