iOS設計模式之--工廠模式

工廠方法模式:定義創(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,RedCanvasGeneratorYellowCanvasViewYellowCanvasGenerator,其中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)常容易將這兩個模式混淆

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 4,094評論 1 15
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,659評論 19 139
  • 出塞二首·其一 王昌齡 秦時明月漢時關,萬里長征人未還。 但使龍城飛將在,不教胡馬度陰山。
    徐若騰閱讀 208評論 0 0
  • 小時候刮獎刮出一個“謝”字還不扔 非要把“謝謝惠顧”四個字都刮的干干凈凈才舍得放手 和后來太多的事一模一樣。 2 ...
    tonight北方有佳人閱讀 4,534評論 45 116
  • 塞下秋來風景異,久違了,新疆! 北方的姑娘,都有一種氣和魂,說不清楚到底是什么。是蒼茫底色下的溫柔與多情,還有天高...
    在路上的木末閱讀 1,332評論 0 2

友情鏈接更多精彩內容