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


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