最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解iOS應(yīng)用開發(fā)中使用設(shè)計(jì)模式中的抽象工廠模式

 更新時(shí)間:2016年03月30日 14:45:44   作者:Snow Liang  
這篇文章主要介紹了iOS應(yīng)用開發(fā)中使用設(shè)計(jì)模式中的抽象工廠模式,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下

概述

  我們知道簡單工廠模式的優(yōu)點(diǎn)是去除了客戶端與具體產(chǎn)品的依賴,缺點(diǎn)是違反了“開放-關(guān)閉原則”;工廠方法模式克服了簡單工廠模式的缺點(diǎn),將產(chǎn)品的創(chuàng)建工作放到具體的工廠類,每個(gè)工廠類負(fù)責(zé)生成一個(gè)產(chǎn)品。但是在實(shí)際應(yīng)用中,一個(gè)工廠類只創(chuàng)建單個(gè)產(chǎn)品的情況很少,一般一個(gè)工廠類會(huì)負(fù)責(zé)創(chuàng)建一系列相關(guān)的產(chǎn)品,如果我們要設(shè)計(jì)這樣的系統(tǒng),工廠方法模式顯然不能滿足應(yīng)用的需求,本章要介紹的抽象工廠模式,可以很好地解決一系列產(chǎn)品創(chuàng)建的問題。

定義

  “提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類。”

最初的定義出現(xiàn)于《設(shè)計(jì)模式》(Addison-Wesley,1994)。
結(jié)構(gòu)圖

2016330144055609.png (874×521)

 先對(duì)上面結(jié)構(gòu)圖的幾個(gè)角色進(jìn)行說明:

AbstractFactory:抽象工廠接口,里面應(yīng)該包含所有產(chǎn)品創(chuàng)建的抽象方法;
ConcreteFactory1和ConcreteFactory2:具體的工廠,創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對(duì)象;
AbstractProductA和AbstractProductB:抽象產(chǎn)品,它們可能有多種不同的實(shí)現(xiàn)方式;
ProductA1、ProductA2、ProductB1和ProductB2:具體的產(chǎn)品,是抽象產(chǎn)品的具體實(shí)現(xiàn)。
  從結(jié)構(gòu)圖中可以看到,抽象工廠方法最大的好處是能夠很方便的變換產(chǎn)品系列(例如id<AbstractFactory> factory =[ [ConcreteFactory1 alloc] init],只需要將ConcreteFactory1換成ConcreteFactory2,就可以創(chuàng)建ProductA2和ProductB2)。另外,抽象工廠方法讓具體的創(chuàng)建實(shí)例過程與客戶端分離,客戶端是通過它們的抽象接口操作實(shí)例,產(chǎn)品的具體類名也被具體工廠的實(shí)現(xiàn)分離,不會(huì)出現(xiàn)在客戶代碼中(例如id<AbstractProductA> product = [factory createProductA],客戶端根本不知道具體的類名是ProductA1還是ProductA2)。

  但是,抽象工廠方法也是存在缺點(diǎn)的,比如說現(xiàn)在我們要增加一個(gè)新的產(chǎn)品,首先,我們需要增加三個(gè)類:AbstractProductC、ProductC1、ProductC2;另外,我們還需要更改三個(gè)類:AbstractFactory、ConcreteFactory1、ConcreteFactory2,這樣,很明顯是違背“開放-關(guān)閉原則”。這也是可以理解的,沒有任何一個(gè)設(shè)計(jì)模式是完美沒有瑕疵的,這就好比世界上沒有打不敗的武功一樣。我們可以做的就是在實(shí)際的需求中,盡可能的將變化點(diǎn)進(jìn)行隔離,以達(dá)到變化發(fā)生的時(shí)候,對(duì)整個(gè)系統(tǒng)的影響最小,變化所帶來的變更和成本最低。

示例

先給大家看一下數(shù)據(jù)庫訪問的類結(jié)構(gòu)圖吧。

2016330144510330.jpg (557×436)

好的,簡單分析一下上面這張類結(jié)構(gòu)圖,這張圖中有三個(gè)獨(dú)立的模塊兒,一個(gè)是IFactory接口,以不同數(shù)據(jù)庫為劃分原則對(duì)部門進(jìn)行抽象,一個(gè)是對(duì)訪問數(shù)據(jù)庫的不同部門,還有一個(gè)是對(duì)數(shù)據(jù)庫操作的人員進(jìn)行了抽象。類圖中沒有提到接下來需要給大家展示的兩個(gè)類,一個(gè)是User類,一個(gè)是Department類,因?yàn)檫@兩個(gè)類是對(duì)數(shù)據(jù)庫數(shù)據(jù)的封裝,和結(jié)構(gòu)并沒有直接關(guān)系,所以沒有顯示出來,在此說明一下,以免大家引起混亂。其實(shí),靜下心來細(xì)細(xì)的看,結(jié)構(gòu)還是蠻清晰的。

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

注意:本文所有代碼均在ARC環(huán)境下編譯通過。

User類接口

復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

@interface User :NSObject
@property int *ID;
@property NSString *Name;
@end


User類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "User.h"

@implementation User
@synthesize Name =_Name;
@synthesize ID =_ID;
@end


Department類接口
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

@interface Department:NSObject
@property int *ID;
@property NSString *DeptName;
@end


Department類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "Department.h"

@implementation Department
@synthesize ID =_ID;
@synthesize DeptName =_DeptName;
@end


IDepartment類接口
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h> 

@class Department;
@interface IDepartment :NSObject
-(void)Insert:(Department*)department;
-(Department*)GetDepartment:(int)myId;
@end


IDepartment類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "IDepartment.h"
#import "Department.h"

@implementation IDepartment
-(void)Insert:(Department *)department{
    return;
}
-(Department*)GetDepartment:(int)myId{
    return nil;
}
@end


SqlserverDepartment類接口
復(fù)制代碼 代碼如下:

#import "IDepartment.h"

@interface SqlserverDepartment:IDepartment
@end


SqlserverDepartment類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "SqlserverDepartment.h"

@implementation SqlserverDepartment
-(void)Insert:(Department *)department{
    NSLog(@"在SQL Server中給Department表增加一條記錄");
}
-(Department*)GetDepartment:(int)myId{
    NSLog(@"在SQL Server中根據(jù)ID得到Department表一條記錄");
    return nil;
}
@end


AccessDepartment類接口
復(fù)制代碼 代碼如下:

#import "IDepartment.h"

@interface AccessDepartment:IDepartment
@end


*AccessDepartment類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "AccessDepartment.h"

@implementation AccessDepartment
-(void)Insert:(Department *)department{
    NSLog(@"在Access中給Department表增加一條記錄");
}
-(Department*)GetDepartment:(int)myId{
    NSLog(@"在Access中根據(jù)myId得到Department表一條記錄");
    return nil;
}
@end


IUser類接口
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

@class User;
@interfaceIUser :NSObject
-(void)Insert:(User*)user;
-(User*)GetUser:(int)myID;
@end


IUser類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "IUser.h"
#import "User.h"

@implementation IUser
-(void)Insert:(User *)user{
    return;
}
-(User*)GetUser:(int)myID{
    return nil;
}
@end


SqlServerUser類接口
復(fù)制代碼 代碼如下:

#import "IUser.h"

@interface SqlServerUser :IUser
@end
SqlServerUser類實(shí)現(xiàn)

#import "SqlServerUser.h"

@implementation SqlServerUser
-(void)Insert:(User *)user{
    NSLog(@"在SQL Server中給User表增加一條記錄");
}
-(User*)GetUser:(int)myID{
    NSLog(@"在SQL Server中根據(jù)myID得到User表一條記錄");
    return nil;
}
@end


AccessUser類接口
復(fù)制代碼 代碼如下:

#import "IUser.h"

@interface AccessUser :IUser
@end


AccessUser類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "AccessUser.h"

@implementation AccessUser
-(void)Insert:(User *)user{
    NSLog(@"在Access中給User表增加一條記錄");
}
-(User*)GetUser:(int)myID{
    NSLog(@"在Access中根據(jù)myID得到User表一條記錄");
    return nil;
}
@end


IFactories類接口
復(fù)制代碼 代碼如下:

#import "AccessUser.h"

@implementation AccessUser
-(void)Insert:(User *)user{
    NSLog(@"在Access中給User表增加一條記錄");
}
-(User*)GetUser:(int)myID{
    NSLog(@"在Access中根據(jù)myID得到User表一條記錄");
    return nil;
}
@end


IFactories類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "IFactories.h"
#import "IUser.h"
#import "IDepartment.h"

@implementation IFactories
-(IUser*)CreateUser{
    return nil;
}
-(IDepartment*)CreateDepartment{
    return nil;
}
@end


AccessFactory類接口
復(fù)制代碼 代碼如下:

#import "IFactories.h"

@interface AccessFactory :IFactories
@end


AccessFactory類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#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類接口
復(fù)制代碼 代碼如下:

#import "IFactories.h"

@interface SqlServerFactory :IFactories
@end


SqlServerFactory類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#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方法調(diào)用
復(fù)制代碼 代碼如下:

#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;
}


上面羅列了一堆代碼,其實(shí),羅列這些代碼的目的只有一個(gè),就是為了幫助像我一樣基礎(chǔ)不太好的同學(xué)盡快入門,有一個(gè)感性的認(rèn)識(shí),邁過第一道門檻。

相關(guān)文章

  • iOS中block的定義與使用

    iOS中block的定義與使用

    蘋果官方文檔聲明,block是objc對(duì)象。下面這篇文章主要給大家介紹了關(guān)于iOS中block的定義與使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • iOS 中根據(jù)屏幕寬度自適應(yīng)分布按鈕的實(shí)例代碼

    iOS 中根據(jù)屏幕寬度自適應(yīng)分布按鈕的實(shí)例代碼

    這篇文章主要介紹了iOS 中根據(jù)屏幕寬度自適應(yīng)分布按鈕的實(shí)例代碼,本文給大家分享兩種方式,代碼簡單易懂,需要的朋友可以參考下
    2016-11-11
  • Dispatch Source Timer的使用及注意事項(xiàng)介紹

    Dispatch Source Timer的使用及注意事項(xiàng)介紹

    這篇文章主要給大家介紹了關(guān)于Dispatch Source Timer使用和一些注意事項(xiàng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • iOS中UITableView Cell實(shí)現(xiàn)自定義單選功能

    iOS中UITableView Cell實(shí)現(xiàn)自定義單選功能

    本篇文章主要介紹了iOS中UITableView Cell實(shí)現(xiàn)自定義單選功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • iOS中WKWebView仿微信加載進(jìn)度條

    iOS中WKWebView仿微信加載進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了iOS中WKWebView仿微信加載進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Objective-C處理空字符串和頁面?zhèn)髦导白远x拷貝

    Objective-C處理空字符串和頁面?zhèn)髦导白远x拷貝

    這篇文章主要介紹了Objective-C處理空字符串和頁面?zhèn)髦导白远x拷貝的相關(guān)方法,在iOS應(yīng)用項(xiàng)目開發(fā)中經(jīng)常會(huì)用到,需要的朋友可以參考下
    2016-01-01
  • 詳談iPhoneX截圖如何帶

    詳談iPhoneX截圖如何帶

    下面小編就為大家分享一篇詳談iPhoneX截圖如何帶"劉海"和圓角,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS基于UIScrollView實(shí)現(xiàn)滑動(dòng)引導(dǎo)頁

    iOS基于UIScrollView實(shí)現(xiàn)滑動(dòng)引導(dǎo)頁

    這篇文章主要為大家詳細(xì)介紹了iOS基于UIScrollView實(shí)現(xiàn)滑動(dòng)引導(dǎo)頁的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式

    IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式

    這篇文章主要介紹了IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • IOS 數(shù)據(jù)存儲(chǔ)詳解及實(shí)例代碼

    IOS 數(shù)據(jù)存儲(chǔ)詳解及實(shí)例代碼

    這篇文章主要介紹了IOS 數(shù)據(jù)存儲(chǔ)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論

宁都县| 菏泽市| 远安县| 桦川县| 晋江市| 饶河县| 苗栗市| 平武县| 玉山县| 鄂温| 岑溪市| 东城区| 阳朔县| 晋城| 三门县| 甘肃省| 平潭县| 桃江县| 梁河县| 财经| 望江县| 武宁县| 逊克县| 浙江省| 从江县| 华坪县| 田阳县| 玉林市| 赤壁市| 乌拉特中旗| 疏勒县| 习水县| 大庆市| 凯里市| 沅江市| 辽中县| 绥德县| 枞阳县| 华池县| 封丘县| 新源县|