抽象工厂(Abstract Factory)
提供一个固定的接口,用于创建一系列有关联或相依存的对象,而不必指定其具体类或其创建的细节。客户端与从工厂得到的具体对象之间没有耦合。
抽象工厂与工厂方法模式的区别
抽象工厂与工厂方法模式在许多方面有很多相似之处,以至于我们常常搞不清楚应该在什么时候用哪一个。两个模式都用于相同的目的:创建对象而不让客户端知晓返回了什么确切的具体对象。
抽象工厂:@、通过对象组合创建抽象产品。@、创建多系列产品。@、必须修改父类的接口才能支持新的产品。
工厂方法:@、通过类继承创建抽象产品。@、创建一种产品。@、子类化创建并重载工厂方法以创建新产品。
抽象工厂模式的优点:
(1)分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
(2)使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。
抽象工厂模式的缺点:
不太容易扩展新的产品:如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
@interface ColorViewFactory : NSObject
// 生产View
+ (UIView *)colorView;
// 生产UIButton
+ (UIButton *)buttonView;
@end
@implementation ColorViewFactory
+ (UIView *)colorView {
return nil;
}
// 生产蓝色的UIButton
+ (UIButton *)buttonView {
return nil;
}
@end
@interface BlueViewFactory : ColorViewFactory
@end
@implementation BlueViewFactory
+ (UIView *)colorView {
return [[BlueSubView alloc] init];
}
+ (UIButton *)buttonView {
return [BlueButton buttonWithType:UIButtonTypeCustom];
}
@end
@interface RedViewFactory : ColorViewFactory
@end
@implementation RedViewFactory
+ (UIView *)colorView {
return [[RedSubView alloc] init];
}
+ (UIButton *)buttonView {
return [RedButton buttonWithType:UIButtonTypeCustom];
}
@end
@interface BlueButton : UIButton
@end
@implementation BlueButton
+ (instancetype)buttonWithType:(UIButtonType)buttonType {
[super buttonWithType:buttonType];
BlueButton *btn = [[BlueButton alloc] initWithFrame:CGRectMake(0, 100, 300, 30)];
[btn setTitle:@"蓝色" forState:UIControlStateNormal];
btn.titleLabel.backgroundColor = [UIColor redColor];
btn.titleLabel.textAlignment = NSTextAlignmentCenter;
return btn;
}
@end
@interface BlueSubView : UIView
@end
@implementation BlueSubView
- (instancetype)init
{
self = [super init];
if (self) {
self.frame = CGRectMake(0, 0, 100, 100);
self.backgroundColor = [UIColor blueColor];
}
return self;
}
@end
@interface RedButton : UIButton
@end
@implementation RedButton
+ (instancetype)buttonWithType:(UIButtonType)buttonType {
[super buttonWithType:buttonType];
RedButton *btn = [[RedButton alloc] initWithFrame:CGRectMake(0, 100, 300, 30)];
[btn setTitle:@"红色" forState:UIControlStateNormal];
btn.titleLabel.backgroundColor = [UIColor redColor];
btn.titleLabel.textAlignment = NSTextAlignmentCenter;
return btn;
}
@end
@interface RedSubView : UIView
@end
@implementation RedSubView
- (instancetype)init
{
self = [super init];
if (self) {
self.frame = CGRectMake(0, 0, 100, 100);
self.backgroundColor = [UIColor redColor];
}
return self;
}
@end
#######
/*
抽象工厂
1. 通过对象组合创建抽象产品
2. 创建多个系列产品
3. 必须修改父类的接口才能支持新的产品
工厂方法
1.通过类继承创建抽象产品
2.创建一种产品
3.子类化创建并重写工厂方法来创建新产品
工厂方法: 多个产品抽象 抽象工厂: 是对工厂抽象
*/
UIView *red = [RedViewFactory colorView];
UIButton *btn = [RedViewFactory buttonView]
[self.view addSubview:btn];
[self.view addSubview:red];