工厂模式-抽象工厂
- 所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。
- 抽象工厂UML图 3.png
- 抽象工厂(Abstract Factory== ColorViewFactory )角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
- 具体工厂(Concrete Factory== BlueViewFactory || RedViewFactory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
- 抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
- 具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
demo实现
- ColorViewFactory(抽象工厂)
#import <UIKit/UIKit.h>
@interface ColorViewFactory : NSObject
+ (UIView *)colorView;
+ (UIButton *)colorButton;
+ (UILabel *)colorLabel;
@end
#import "ColorViewFactory.h"
@implementation ColorViewFactory
+ (UIView *)colorView
{
return nil;
}
+ (UIButton *)colorButton
{
return nil;
}
+ (UILabel *)colorLabel{
return nil;
}
- BlueViewFactory (具体工厂)
#import "ColorViewFactory.h"
@interface BlueViewFactory : ColorViewFactory
@end
#import "BlueViewFactory.h"
#import "BlueView.h"
#import "BlueLabel.h"
#import "BlueButton.h"
@implementation BlueViewFactory
+ (UIView *)colorView
{
return [[BlueView alloc] init];
}
+ (UIButton *)colorButton
{
//创建具体的产品对象
return [BlueButton buttonWithType:UIButtonTypeCustom];
}
+ (UILabel *)colorLabel
{
return [[BlueLabel alloc] init];
}
@end
- RedViewFactory(具体工厂)
#import "ColorViewFactory.h"
@interface RedViewFactory : ColorViewFactory
@end
#import "RedViewFactory.h"
#import "RedView.h"
#import "RedButton.h"
#import "RedLabel.h"
@implementation RedViewFactory
+ (UIView *)colorView
{
return [[RedView alloc] init];
}
+ (UIButton *)colorButton
{
return [RedButton buttonWithType:UIButtonTypeCustom];
}
+ (UILabel *)colorLabel
{
return [[RedLabel alloc] init];
}
@end
- RedView (具体产品)
#import <UIKit/UIKit.h>
@interface RedView : UIView
@end
#import "RedView.h"
@implementation RedView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
self.frame = CGRectMake(0, 0, 100, 100);
self.backgroundColor = [UIColor redColor];
return self;
}
@end
- ViewController 类
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
#import "ViewController.h"
#import "BlueViewFactory.h"
#import "RedViewFactory.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *view = [BlueViewFactory colorView];
[self.view addSubview: view];
UIButton *btn = [BlueViewFactory colorButton];
[self.view addSubview: btn];
UILabel *lab = [BlueViewFactory colorLabel];
lab.frame = CGRectMake(100, 200, 100, 100);
lab.text = @"测试";
lab.backgroundColor = [UIColor blueColor];
[self.view addSubview:lab];
}
@end
源码详见:https://github.com/defuliu/AbstractFactory.git
小结
工厂方法:
1.通过类继承创建抽象产品
2.创建一种产品
3.子类化创建并重写工厂方法以创建新产品
抽象工厂:
1.通过对象组合创建抽象产品
2.创建多个系列的产品
3.必须要修改父类的接口才能支持新的产品
网友评论