抽象工廠模式(Abstract Factory),提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
其實,我個人的理解是,抽象工廠模式顧名思義,就是抽象出一個接口層,然後結合工廠模式。呵呵,聽起來跟沒說一樣,好吧,還是先給大家看一下數據庫訪問的類結構圖吧。
好的,簡單分析一下上面這張類結構圖,這張圖中有三個獨立的模塊兒,一個是IFactory接口,以不同數據庫爲劃分原則對部門進行抽象,一個是對訪問數據庫的不同部門,還有一個是對數據庫操作的人員進行了抽象。類圖中沒有提到接下來需要給大家展示的兩個類,一個是User類,一個是Department類,因爲這兩個類是對數據庫數據的封裝,和結構並沒有直接關係,所以沒有顯示出來,在此說明一下,以免大家引起混亂。其實,靜下心來細細的看,結構還是蠻清晰的。
呵呵,下面還是老樣子,給大家展示一下代碼。
-
User類接口
1
2
3
4
5
6
|
#import
<Foundation/Foundation.h> @interface User
: NSObject @property int
*ID; @property NSString
*Name; @end |
-
User類實現
1
2
3
4
5
6
|
#import
"User.h" @implementation User @synthesize Name
=_Name; @synthesize ID
=_ID; @end |
-
Department類接口
1
2
3
4
5
6
|
#import
<Foundation/Foundation.h> @interface Department: NSObject @property int
*ID; @property NSString
*DeptName; @end |
-
Department類實現
1
2
3
4
5
6
|
#import
"Department.h" @implementation Department @synthesize ID
=_ID; @synthesize DeptName
=_DeptName; @end |
-
IDepartment類接口
1
2
3
4
5
6
7
|
#import
<Foundation/Foundation.h> @class Department; @interface IDepartment
: NSObject -( void )Insert:(Department*)department; -(Department*)GetDepartment:( int )myId; @end |
-
IDepartment類實現
1
2
3
4
5
6
7
8
9
10
11
|
#import
"IDepartment.h" #import
"Department.h" @implementation IDepartment -( void )Insert:(Department
*)department{ return ; } -(Department*)GetDepartment:( int )myId{ return nil ; } @end |
-
SqlserverDepartment類接口
1
2
3
4
|
#import
"IDepartment.h" @interface SqlserverDepartment:IDepartment @end |
-
SqlserverDepartment類實現
1
2
3
4
5
6
7
8
9
10
11
|
#import
"SqlserverDepartment.h" @implementation SqlserverDepartment -( void )Insert:(Department
*)department{ NSLog (@ "在SQL
Server中給Department表增加一條記錄" ); } -(Department*)GetDepartment:( int )myId{ NSLog (@ "在SQL
Server中根據ID得到Department表一條記錄" ); return nil ; } @end |
-
AccessDepartment類接口
1
2
3
4
|
#import
"IDepartment.h" @interface AccessDepartment:IDepartment @end |
-
AccessDepartment類實現
1
2
3
4
5
6
7
8
9
10
11
|
#import
"AccessDepartment.h" @implementation AccessDepartment -( void )Insert:(Department
*)department{ NSLog (@ "在Access中給Department表增加一條記錄" ); } -(Department*)GetDepartment:( int )myId{ NSLog (@ "在Access中根據myId得到Department表一條記錄" ); return nil ; } @end |
-
IUser類接口
1
2
3
4
5
6
7
|
#import
<Foundation/Foundation.h> @class User; @interfaceIUser : NSObject -( void )Insert:(User*)user; -(User*)GetUser:( int )myID; @end |
-
IUser類實現
1
2
3
4
5
6
7
8
9
10
11
|
#import
"IUser.h" #import
"User.h" @implementation IUser -( void )Insert:(User
*)user{ return ; } -(User*)GetUser:( int )myID{ return nil ; } @end |
-
SqlServerUser類接口
1
2
3
4
|
#import
"IUser.h" @interface SqlServerUser
:IUser @end |
-
SqlServerUser類實現
1
2
3
4
5
6
7
8
9
10
11
|
#import
"SqlServerUser.h" @implementation SqlServerUser -( void )Insert:(User
*)user{ NSLog (@ "在SQL
Server中給User表增加一條記錄" ); } -(User*)GetUser:( int )myID{ NSLog (@ "在SQL
Server中根據myID得到User表一條記錄" ); return nil ; } @end |
-
AccessUser類接口
1
2
3
4
|
#import
"IUser.h" @interface AccessUser
:IUser @end |
-
AccessUser類實現
1
2
3
4
5
6
7
8
9
10
11
|
#import
"AccessUser.h" @implementation AccessUser -( void )Insert:(User
*)user{ NSLog (@ "在Access中給User表增加一條記錄" ); } -(User*)GetUser:( int )myID{ NSLog (@ "在Access中根據myID得到User表一條記錄" ); return nil ; } @end |
-
IFactories類接口
1
2
3
4
5
6
7
8
9
10
11
|
#import
"AccessUser.h"
@interface IFactories : AccessUser - (IUser *)CreateUser; - (IDepartment *)CreateDepartment;
@end |
-
IFactories類實現
1
2
3
4
5
6
7
8
9
10
11
12
|
#import
"IFactories.h" #import
"IUser.h" #import
"IDepartment.h" @implementation IFactories -(IUser*)CreateUser{ return nil ; } -(IDepartment*)CreateDepartment{ return nil ; } @end |
-
AccessFactory類接口
1
2
3
4
|
#import
"IFactories.h" @interface AccessFactory
:IFactories @end |
-
AccessFactory類實現
1
2
3
4
5
6
7
8
9
10
11
12
|
#import
"AccessFactory.h" #import
"AccessUser.h" #import
"AccessDepartment.h" @implementation AccessFactory -(IUser*)CreateUser{ return [[AccessUser
alloc]init]; } -(IDepartment*)CreateDepartment{ return [[AccessDepartment
alloc]init]; } @end |
-
SqlServerFactory類接口
1
2
3
4
|
#import
"IFactories.h" @interface SqlServerFactory
:IFactories @end |
-
SqlServerFactory類實現
1
2
3
4
5
6
7
8
9
10
11
12
|
#import
"SqlServerFactory.h" #import
"SqlServerUser.h" #import
"SqlserverDepartment.h" @implementation SqlServerFactory -(IUser*)CreateUser{ return [[SqlServerUser
alloc]init]; } -(IDepartment*)CreateDepartment{ return [[SqlserverDepartment
alloc]init]; } @end |
-
Main方法調用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#import
<Foundation/Foundation.h> #import
"User.h" #import
"Department.h" #import
"IFactories.h" #import
"AccessFactory.h" #import
"IUser.h" #import
"IDepartment.h" int main
( int argc, const char
* argv[]) { @autoreleasepool { User
*user = [[User alloc]init]; Department
*dept = [[Department alloc]init]; IFactories
*factories = [[AccessFactory alloc]init]; IUser
*iu = [factories CreateUser]; [iu
Insert:user]; [iu
GetUser:1]; IDepartment
*myId = [factories CreateDepartment]; [myId
Insert:dept]; [myId
GetDepartment:1]; } return 0; } |
上面羅列了一堆代碼,其實,羅列這些代碼的目的只有一個,就是爲了幫助像我一樣基礎不太好的同學儘快入門,有一個感性的認識,邁過第一道門檻。
好啦,閒話先不多說,下面給出原汁原味的類結構圖,大家可以類比上面的圖進行理解。
仔細看上面這張圖,是不是和開始舉的那個例子的類結構圖很像呢!?對應關係簡單羅列一下:
原味圖-------------------------例子圖
AbstractFactory-------------IFactory
ConcreteFactory1-----------SqlServerFactory
ConcreteFactory2-----------AccessFactory
AbstractProductA-----------IUser
AbstractProductB-----------IDepartment