你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 詳解iOS運用開辟中應用設計形式中的籠統工場形式

詳解iOS運用開辟中應用設計形式中的籠統工場形式

編輯:IOS開發綜合

概述

  我們曉得簡略工場形式的長處是去除客戶端與詳細產物的依附,缺陷是違背了“開放-封閉准繩”;工場辦法形式戰勝了簡略工場形式的缺陷,將產物的創立任務放到詳細的工場類,每一個工場類擔任生成一個產物。然則在現實運用中,一個工場類只創立單個產物的情形很少,普通一個工場類會擔任創立一系列相干的產物,假如我們要設計如許的體系,工場辦法形式明顯不克不及知足運用的需求,本章要引見的籠統工場形式,可以很好地處理一系列產物創立的成績。

界說

  “供給一個創立一系列相干或互相依附對象的接口,而無需指定它們詳細的類。”

最後的界說湧現於《設計形式》(Addison-Wesley,1994)。
構造圖

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615492608.png (874×521)

 先對下面構造圖的幾個腳色停止解釋:

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,如許,很顯著是違反“開放-封閉准繩”。這也是可以懂得的,沒有任何一個設計形式是完善沒有瑕疵的,這就比如世界上沒有打不敗的武功一樣。我們可以做的就是在現實的需求中,盡量的將變更點停止隔離,以到達變更產生的時刻,對全部體系的影響最小,變更所帶來的變革和本錢最低。

示例

先給年夜家看一下數據庫拜訪的類構造圖吧。

2016330144510330.jpg (557×436)

好的,簡略剖析一下下面這張類構造圖,這張圖中有三個自力的模塊兒,一個是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運用開辟中應用設計形式中的籠統工場形式】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved