Objective C 抽象工廠模式

抽象工廠模式(Abstract Factory),提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

 其實,我個人的理解是,抽象工廠模式顧名思義,就是抽象出一個接口層,然後結合工廠模式。呵呵,聽起來跟沒說一樣,好吧,還是先給大家看一下數據庫訪問的類結構圖吧。


 

 好的,簡單分析一下上面這張類結構圖,這張圖中有三個獨立的模塊兒,一個是IFactory接口,以不同數據庫爲劃分原則對部門進行抽象,一個是對訪問數據庫的不同部門,還有一個是對數據庫操作的人員進行了抽象。類圖中沒有提到接下來需要給大家展示的兩個類,一個是User類,一個是Department類,因爲這兩個類是對數據庫數據的封裝,和結構並沒有直接關係,所以沒有顯示出來,在此說明一下,以免大家引起混亂。其實,靜下心來細細的看,結構還是蠻清晰的。

 呵呵,下面還是老樣子,給大家展示一下代碼。

  • User類接口

1
2
3
4
5
6
#import <Foundation/Foundation.h>
                                                      
@interfaceUser :NSObject
@propertyint *ID;
@propertyNSString *Name;
@end
  • User類實現

1
2
3
4
5
6
#import "User.h"
                                                     
@implementationUser
@synthesizeName =_Name;
@synthesizeID =_ID;
@end
  • Department類接口

1
2
3
4
5
6
#import <Foundation/Foundation.h>
                                                   
@interfaceDepartment:NSObject
@propertyint *ID;
@propertyNSString *DeptName;
@end
  • Department類實現

1
2
3
4
5
6
#import "Department.h"
                                                  
@implementationDepartment
@synthesizeID =_ID;
@synthesizeDeptName =_DeptName;
@end
  • IDepartment類接口

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>
                                                
@classDepartment;
@interfaceIDepartment :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"
                                               
@implementationIDepartment
-(void)Insert:(Department *)department{
  return;
}
-(Department*)GetDepartment:(int)myId{
  returnnil;
}
@end
  • SqlserverDepartment類接口

1
2
3
4
#import "IDepartment.h"
                                             
@interfaceSqlserverDepartment:IDepartment
@end
  • SqlserverDepartment類實現

1
2
3
4
5
6
7
8
9
10
11
#import "SqlserverDepartment.h"
                                            
@implementationSqlserverDepartment
-(void)Insert:(Department *)department{
  NSLog(@"在SQL Server中給Department表增加一條記錄");
}
-(Department*)GetDepartment:(int)myId{
  NSLog(@"在SQL Server中根據ID得到Department表一條記錄");
  returnnil;
}
@end
  • AccessDepartment類接口

1
2
3
4
#import "IDepartment.h"
                                          
@interfaceAccessDepartment:IDepartment
@end
  • AccessDepartment類實現

1
2
3
4
5
6
7
8
9
10
11
#import "AccessDepartment.h"
                                        
@implementationAccessDepartment
-(void)Insert:(Department *)department{
  NSLog(@"在Access中給Department表增加一條記錄");
}
-(Department*)GetDepartment:(int)myId{
  NSLog(@"在Access中根據myId得到Department表一條記錄");
  returnnil;
}
@end
  • IUser類接口

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>
                                      
@classUser;
@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"
                             
@implementationIUser
-(void)Insert:(User *)user{
  return;
}
-(User*)GetUser:(int)myID{
  returnnil;
}
@end
  • SqlServerUser類接口

1
2
3
4
#import "IUser.h"
                          
@interfaceSqlServerUser :IUser
@end
  • SqlServerUser類實現

1
2
3
4
5
6
7
8
9
10
11
#import "SqlServerUser.h"
                        
@implementationSqlServerUser
-(void)Insert:(User *)user{
  NSLog(@"在SQL Server中給User表增加一條記錄");
}
-(User*)GetUser:(int)myID{
  NSLog(@"在SQL Server中根據myID得到User表一條記錄");
  returnnil;
}
@end
  • AccessUser類接口

1
2
3
4
#import "IUser.h"
                      
@interfaceAccessUser :IUser
@end
  • AccessUser類實現

1
2
3
4
5
6
7
8
9
10
11
#import "AccessUser.h"
                    
@implementationAccessUser
-(void)Insert:(User *)user{
  NSLog(@"在Access中給User表增加一條記錄");
}
-(User*)GetUser:(int)myID{
  NSLog(@"在Access中根據myID得到User表一條記錄");
  returnnil;
}
@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"
                
@implementationIFactories
-(IUser*)CreateUser{
  returnnil;
}
-(IDepartment*)CreateDepartment{
  returnnil;
}
@end
  • AccessFactory類接口

1
2
3
4
#import "IFactories.h"
              
@interfaceAccessFactory :IFactories
@end
  • AccessFactory類實現

1
2
3
4
5
6
7
8
9
10
11
12
#import "AccessFactory.h"
#import "AccessUser.h"
#import "AccessDepartment.h"
            
@implementationAccessFactory
-(IUser*)CreateUser{
  return[[AccessUser alloc]init];
}
-(IDepartment*)CreateDepartment{
  return[[AccessDepartment alloc]init];
}
@end
  • SqlServerFactory類接口

1
2
3
4
#import "IFactories.h"
          
@interfaceSqlServerFactory :IFactories
@end
  • SqlServerFactory類實現

1
2
3
4
5
6
7
8
9
10
11
12
#import "SqlServerFactory.h"
#import "SqlServerUser.h"
#import "SqlserverDepartment.h"
        
@implementationSqlServerFactory
-(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"
      
intmain (intargc,constchar * 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];
  }
return0;
}

 上面羅列了一堆代碼,其實,羅列這些代碼的目的只有一個,就是爲了幫助像我一樣基礎不太好的同學儘快入門,有一個感性的認識,邁過第一道門檻。

 好啦,閒話先不多說,下面給出原汁原味的類結構圖,大家可以類比上面的圖進行理解。


   仔細看上面這張圖,是不是和開始舉的那個例子的類結構圖很像呢!?對應關係簡單羅列一下:

   原味圖-------------------------例子圖

   AbstractFactory-------------IFactory

   ConcreteFactory1-----------SqlServerFactory

   ConcreteFactory2-----------AccessFactory

   AbstractProductA-----------IUser

   AbstractProductB-----------IDepartment


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章