概述
我們曉得簡略工場形式的長處是去除客戶端與詳細產物的依附,缺陷是違背了“開放-封閉准繩”;工場辦法形式戰勝了簡略工場形式的缺陷,將產物的創立任務放到詳細的工場類,每一個工場類擔任生成一個產物。然則在現實運用中,一個工場類只創立單個產物的情形很少,普通一個工場類會擔任創立一系列相干的產物,假如我們要設計如許的體系,工場辦法形式明顯不克不及知足運用的需求,本章要引見的籠統工場形式,可以很好地處理一系列產物創立的成績。
界說
“供給一個創立一系列相干或互相依附對象的接口,而無需指定它們詳細的類。”
最後的界說湧現於《設計形式》(Addison-Wesley,1994)。
構造圖
先對下面構造圖的幾個腳色停止解釋:
AbstractFactory:籠統工場接口,外面應當包括一切產物創立的籠統辦法;
ConcreteFactory1和ConcreteFactory2:詳細的工場,創立具有特定完成的產物對象;
AbstractProductA和AbstractProductB:籠統產物,它們能夠有多種分歧的完成方法;
ProductA1、ProductA2、ProductB1和ProductB2:詳細的產物,是籠統產物的詳細完成。
從構造圖中可以看到,籠統工場辦法最年夜的利益是可以或許很便利的變換產物系列(例如id<AbstractFactory> factory =[ [ConcreteFactory1 alloc] init],只須要將ConcreteFactory1換成ConcreteFactory2,便可以創立ProductA2和ProductB2)。別的,籠統工場辦法讓詳細的創立實例進程與客戶端分別,客戶端是經由過程它們的籠統接口操作實例,產物的詳細類名也被詳細工場的完成分別,不會湧現在客戶代碼中(例如id<AbstractProductA> product = [factory createProductA],客戶端基本不曉得詳細的類名是ProductA1照樣ProductA2)。
然則,籠統工場辦法也是存在缺陷的,好比說如今我們要增長一個新的產物,起首,我們須要增長三個類:AbstractProductC、ProductC1、ProductC2;別的,我們還須要更改三個類:AbstractFactory、ConcreteFactory1、ConcreteFactory2,如許,很顯著是違反“開放-封閉准繩”。這也是可以懂得的,沒有任何一個設計形式是完善沒有瑕疵的,這就比如世界上沒有打不敗的武功一樣。我們可以做的就是在現實的需求中,盡量的將變更點停止隔離,以到達變更產生的時刻,對全部體系的影響最小,變更所帶來的變革和本錢最低。
示例
先給年夜家看一下數據庫拜訪的類構造圖吧。
好的,簡略剖析一下下面這張類構造圖,這張圖中有三個自力的模塊兒,一個是IFactory接口,以分歧數據庫為劃分准繩對部分停止籠統,一個是對拜訪數據庫的分歧部分,還有一個是對數據庫操作的人員停止了籠統。類圖中沒有提到接上去須要給年夜家展現的兩個類,一個是User類,一個是Department類,由於這兩個類是對數據庫數據的封裝,和構造並沒有直接關系,所以沒有顯示出來,在此解釋一下,以避免年夜家惹起凌亂。其實,靜下心來細細的看,構造照樣蠻清楚的。
呵呵,上面照樣老模樣,給年夜家展現一下代碼。
留意:本文一切代碼均在ARC情況下編譯經由過程。
User類接口
#import <Foundation/Foundation.h>
@interface User :NSObject
@property int *ID;
@property NSString *Name;
@end
User類完成
#import "User.h"
@implementation User
@synthesize Name =_Name;
@synthesize ID =_ID;
@end
Department類接口
#import <Foundation/Foundation.h>
@interface Department:NSObject
@property int *ID;
@property NSString *DeptName;
@end
Department類完成
#import "Department.h"
@implementation Department
@synthesize ID =_ID;
@synthesize DeptName =_DeptName;
@end
IDepartment類接口
#import <Foundation/Foundation.h>
@class Department;
@interface IDepartment :NSObject
-(void)Insert:(Department*)department;
-(Department*)GetDepartment:(int)myId;
@end
IDepartment類完成
#import "IDepartment.h"
#import "Department.h"
@implementation IDepartment
-(void)Insert:(Department *)department{
return;
}
-(Department*)GetDepartment:(int)myId{
return nil;
}
@end
SqlserverDepartment類接口
#import "IDepartment.h"
@interface SqlserverDepartment:IDepartment
@end
SqlserverDepartment類完成
#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類接口
#import "IDepartment.h"
@interface AccessDepartment:IDepartment
@end
*AccessDepartment類完成
#import "AccessDepartment.h"
@implementation AccessDepartment
-(void)Insert:(Department *)department{
NSLog(@"在Access中給Department表增長一筆記錄");
}
-(Department*)GetDepartment:(int)myId{
NSLog(@"在Access中依據myId獲得Department表一筆記錄");
return nil;
}
@end
IUser類接口
#import <Foundation/Foundation.h>
@class User;
@interfaceIUser :NSObject
-(void)Insert:(User*)user;
-(User*)GetUser:(int)myID;
@end
IUser類完成
#import "IUser.h"
#import "User.h"
@implementation IUser
-(void)Insert:(User *)user{
return;
}
-(User*)GetUser:(int)myID{
return nil;
}
@end
SqlServerUser類接口
#import "IUser.h"
@interface SqlServerUser :IUser
@end
SqlServerUser類完成
#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類接口
#import "IUser.h"
@interface AccessUser :IUser
@end
AccessUser類完成
#import "AccessUser.h"
@implementation AccessUser
-(void)Insert:(User *)user{
NSLog(@"在Access中給User表增長一筆記錄");
}
-(User*)GetUser:(int)myID{
NSLog(@"在Access中依據myID獲得User表一筆記錄");
return nil;
}
@end
IFactories類接口
#import "AccessUser.h"
@implementation AccessUser
-(void)Insert:(User *)user{
NSLog(@"在Access中給User表增長一筆記錄");
}
-(User*)GetUser:(int)myID{
NSLog(@"在Access中依據myID獲得User表一筆記錄");
return nil;
}
@end
IFactories類完成
#import "IFactories.h"
#import "IUser.h"
#import "IDepartment.h"
@implementation IFactories
-(IUser*)CreateUser{
return nil;
}
-(IDepartment*)CreateDepartment{
return nil;
}
@end
AccessFactory類接口
#import "IFactories.h"
@interface AccessFactory :IFactories
@end
AccessFactory類完成
#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類接口
#import "IFactories.h"
@interface SqlServerFactory :IFactories
@end
SqlServerFactory類完成
#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辦法挪用
#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;
}
下面枚舉了一堆代碼,其實,枚舉這些代碼的目標只要一個,就是為了贊助像我一樣基本不太好的同窗盡快入門,有一個理性的熟悉,邁過第一道門坎。
【詳解iOS運用開辟中應用設計形式中的籠統工場形式】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!