工廠方法模式:定義創(chuàng)建對象的接口,讓子類決定實列化哪一個類,工廠方法使得一個類的實例化延遲到其子類。
- 工廠方法也稱虛構造器,當一個類無法預期需要生成哪個類的對象,想讓其子類來指定所生成的對象,這時就會用到工廠模式,可能這樣說你還不理解,沒事,會在后面附上代碼,一步步帶你理解何謂工廠方法
何時使用工廠方法
- 編譯時無法確定預期要創(chuàng)建的對象的類型
- 類想讓其子類決定在運行期間創(chuàng)建哪種類型的對象
- 類有若干個輔助類為其子類,而你想將返回哪個子類這一信息局部化
代碼演示及講解
這里我們用一個最簡單創(chuàng)建不同類型的畫布的例子來演示工廠模式的實現(xiàn)方式
- 首先定義其父類,我們把他命名為CanvasView(意思為畫布),你可以在里面實現(xiàn)畫布的默認樣式,比如我們想畫布默認為黑色
//.h里面可以定義一些屬性和方法,這個取決于具體需求
#import <UIKit/UIKit.h>
@interface CanvasView : UIView
{}
...
@end
//.m文件就實現(xiàn)畫布的默認樣式
#import "CanvasView.h"
@implementation CanvasView
-(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor blackColor];
}
return self;
}
@end
*第二步,定義生成器,用來生成畫布對象,這個生成器就生成了一張默認為黑色的畫布
#import <Foundation/Foundation.h>
#import "CanvasView.h"
@interface CanvasViewGenerator : NSObject
-(CanvasView *)canvasViewWithFrame:(CGRect)frame;
@end
#import "CanvasViewGenerator.h"
@implementation CanvasViewGenerator
-(CanvasView *)canvasViewWithFrame:(CGRect)frame
{
return [[CanvasView alloc] initWithFrame:frame];
}
@end
*下面我們開始定義不同類型的畫布對象及其生成器,我們把他們定義為紅色和黃色兩種類型,分別命名為RedCanvasView,RedCanvasGenerator和YellowCanvasView,YellowCanvasGenerator,其中RedCanvasView和YellowCanvasView繼承于CanvasView,RedCanvasGenerator和YellowCanvasGenerator繼承于CanvasGenerator
//--------------------------紅色畫布代碼--------------------------
#import "CanvasView.h"
@interface RedCanvasView : CanvasView
@end
@implementation RedCanvasView
-(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor redColor];
}
return self;
}
@end
#import <Foundation/Foundation.h>
#import "CanvasViewGenerator.h"
#import "RedCanvasView.h"
@interface RedCanvasViewGenerrator :CanvasViewGenerator
@end
#import "RedCanvasViewGenerrator.h"
@implementation RedCanvasViewGenerrator
-(CanvasView *)canvasViewWithFrame:(CGRect)frame
{
return [[RedCanvasView alloc] initWithFrame:frame];
}
@end
//--------------------------黃色畫布代碼--------------------------
#import "CanvasView.h"
@interface YellowCanvasView : CanvasView
@end
#import "YellowCanvasView.h"
@implementation YellowCanvasView
-(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor YellowColor];
}
return self;
}
@end
#import <Foundation/Foundation.h>
#import "CanvasViewGenerator.h"
#import "YellowCanvasView.h"
@interface YellowCanvasViewGenerrator : CanvasViewGenerator
@end
#import "YellowCanvasViewGenerrator.h"
@implementation YellowCanvasViewGenerrator
-(CanvasView *)canvasViewWithFrame:(CGRect)frame
{
return [[YellowCanvasView alloc] initWithFrame:frame];
}
@end
*畫布使用
#import "ViewController.h"
#import "RedCanvasViewGenerrator.h"
#import "YellowCanvasViewGenerrator.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
RedCanvasViewGenerrator *defaultGenerator = [[RedCanvasViewGenerrator alloc] init];
[self loadCanvasViewWithGenerator:defaultGenerator];
}
-(void)loadCanvasViewWithGenerator:(CanvasViewGenerator *)generator
{
[_canvasView removeFromSuperview];
CGRect frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
CanvasView *canvasView = [generator canvasViewWithFrame:frame];
self.canvasView = canvasView;
[self.view addSubview:self.canvasView];
}
在控制器中,我們使用RedCanvasViewGenerrator *defaultGenerator = [[RedCanvasViewGenerrator alloc] init];和
[self loadCanvasViewWithGenerator:defaultGenerator];這兩個方法來創(chuàng)建了一個紅色畫布。
在下一篇中,我們將繼續(xù)討論抽象工廠模式,人們經(jīng)常容易將這兩個模式混淆