關於IOS工廠模式的一些看法

IOS中存在很是多的類工廠模式的設計方式; 
豐富了類的實現模式, 父類能夠聲明多種初始化方法提供給子類,子類按照自身需求能夠動態的調用父類的方法完成
特定的初始化操做; 
例如uiview的實現
initwithframe
init

一個從嚴格意義上講的工廠模式應該是一個純虛的構造方法.父類並不進行初始化,而是有子類進行具體對象的建立
父類的初始化方法能夠理解爲工廠; 
 開放不一樣接口攜帶不一樣參數的初始化方法能夠理解爲父類所提供的多個工廠;
子類能夠經過其特定的工廠,生產出特定的對象

實際上 不少程序員在開發的時候並無工廠模式的這種概念,可是實際上他們在實現程序功能的時候每每會用到工廠
方法的開發思想;  從個人角度出發,我認爲工廠方法是一種規範化的編程習慣和規範,也是衆多前輩在開發過程當中積累的
經驗,能夠提高開發效率和可維護性


IOS的Foundation框架中,中咱們經常使用到一些類頭  在初始化方法或者調用系統方法的時候用到,也有些人管這個叫作類簇
好比說 NSArray NSString NSDictionary ,咱們經過他們建立的對象都是其子類的實例化,並不是其自己的實例化

設計優點的體現:
一個工廠知足全部要求, 不須要建立過多類似的類 簡化了編程,方便程序員開發;由於不少類名不用記了,這也是面向對象
編程的集中體現

經過上面的分析,咱們大體能夠總結出工廠這種設計模式的應用場景:
程序員

(1)當一個類並不知道要建立的具體對象是什麼,交由子類處理編程

(2)當一些類有類似的行爲和結構,只是具體實現不一樣時,能夠抽象出工廠設計模式

(3)使用者並不在意具體類型,只在意接口約定的行爲,而且這種行爲有個體差別框架


實例我借鑑了琿少的工程文檔iview

首先,咱們建立一個抽象的工程類,在其中建立一些私有的子類:
工具

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#import <Foundation/Foundation.h>
//交通工具的枚舉
typedef  enum  {
car,
boat,
airport,
bycicle,
bus,
taxi
}ToolsName;
//代理
 
@protocol TransPortationDelegate <NSObject>
 
-( void )toHome:(Class) class ;
 
@end
//抽象工廠類
 
@interface TramsPortationFactory : NSObject
+(TramsPortationFactory*)buyTool:(ToolsName)tool;
//共有的方法接口
 
-( int )shouldPayMoney;
-( void )run;
@property(nonatomic,strong)id<TransPortationDelegate>delegate;
@end
//具體實現的子類
@interface CarFactory : TramsPortationFactory
 
@end
@interface BoatFactory : TramsPortationFactory
 
@end
@interface AirportFactory : TramsPortationFactory
 
@end
@interface BycicleFactory : TramsPortationFactory
 
@end
@interface TaxiFactory : TramsPortationFactory
 
@end
@interface BusFactory : TramsPortationFactory
 
@end

實現文件以下:
ui

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#import "TramsPortationFactory.h"
 
@implementation TramsPortationFactory
//實現的建立方法
+(TramsPortationFactory*)buyTool:(ToolsName)tool{
     switch  (tool) {
         case  car:
             return  [[CarFactory alloc]init];
             break ;
         case  airport:
             return  [[AirportFactory alloc]init];
             break ;
         case  bycicle:
             return  [[BycicleFactory alloc]init];
             break ;
         case  boat:
             return  [[BoatFactory alloc]init];
             break ;
         case  taxi:
             return  [[TaxiFactory alloc]init];
             break ;
         case  bus:
             return  [[BusFactory alloc]init];
             break ;
         default :
             break ;
     }
}
 
-( int )shouldPayMoney{
     return  0;
}
-( void )run{
     [self.delegate toHome:[self  class ]];
}
@end
//各自類實現具體的行爲
@implementation CarFactory
-( int )shouldPayMoney{
     return  50;
}
-( void )run{
     [super run];
     NSLog(@ "car to home" );
}
@end
@implementation AirportFactory
-( int )shouldPayMoney{
     return  1000;
}
-( void )run{
     [super run];
     NSLog(@ "fly to home" );
}
@end
@implementation BoatFactory
-( int )shouldPayMoney{
     return  300;
}
-( void )run{
     [super run];
     NSLog(@ "boat to home" );
}
@end
@implementation BusFactory
-( int )shouldPayMoney{
     return  10;
}
-( void )run{
     [super run];
     NSLog(@ "bus to home" );
}
@end
@implementation BycicleFactory
-( int )shouldPayMoney{
     return  0;
}
-( void )run{
     [super run];
     NSLog(@ "run to home" );
}
@end
@implementation TaxiFactory
-( int )shouldPayMoney{
     return  100;
}
-( void )run{
     [super run];
     NSLog(@ "go to home" );
}
@end

這樣,咱們的一個生產工廠就完成了,在外面,咱們只須要知道一個類,咱們的抽象父類,就能夠實現個子類的行爲,示例以下:
atom

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- ( void )viewDidLoad {
     [super viewDidLoad];
     TramsPortationFactory * tool = [TramsPortationFactory buyTool:car];
     tool.delegate=self;
     [tool run];
     NSLog(@ "花了:%d錢" ,[tool shouldPayMoney]);
     TramsPortationFactory * tool2 = [TramsPortationFactory buyTool:airport];
     tool2.delegate=self;
     [tool2 run];
     NSLog(@ "花了:%d錢" ,[tool2 shouldPayMoney]);
     
     
}
-( void )toHome:(Class) class {
     NSLog(@ "%@" ,NSStringFromClass( class ));
}

能夠看到,對於開發者,咱們並不知曉CarFactory類的存在,咱們只須要經過TramsPortationFactory類,就可以操做各類交通工具,達到咱們的需求。spa




相關文章
相關標籤/搜索