亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解iOS應用開發中使用設計模式中的抽象工廠模式

2020-07-26 03:24:10
字體:
來源:轉載
供稿:網友

概述

  我們知道簡單工廠模式的優點是去除了客戶端與具體產品的依賴,缺點是違反了“開放-關閉原則”;工廠方法模式克服了簡單工廠模式的缺點,將產品的創建工作放到具體的工廠類,每個工廠類負責生成一個產品。但是在實際應用中,一個工廠類只創建單個產品的情況很少,一般一個工廠類會負責創建一系列相關的產品,如果我們要設計這樣的系統,工廠方法模式顯然不能滿足應用的需求,本章要介紹的抽象工廠模式,可以很好地解決一系列產品創建的問題。

定義

  “提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類?!?/p>

最初的定義出現于《設計模式》(Addison-Wesley,1994)。
結構圖

2016330144055609.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;
}


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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利视频导航一区| 国产suv精品一区二区三区88区| 一区二区三区视频在线| 中文字幕日韩欧美在线视频| 色妞色视频一区二区三区四区| 日韩电视剧免费观看网站| 亚洲国内高清视频| 欧美福利在线观看| 九九热最新视频//这里只有精品| 麻豆国产精品va在线观看不卡| 亚洲欧洲在线看| 热久久视久久精品18亚洲精品| 91香蕉亚洲精品| 日韩中文字幕网站| 国产成人一区二区三区电影| 国产欧美精品在线| 国产成人精品一区二区| 日韩av快播网址| 日韩免费av在线| 欧美日韩亚洲高清| 夜夜躁日日躁狠狠久久88av| 亚洲午夜av久久乱码| 欧美激情区在线播放| 久久久久久久网站| 91欧美精品成人综合在线观看| 欧美黑人xxxx| 日韩在线欧美在线| 精品露脸国产偷人在视频| 九九久久久久久久久激情| 亚洲国产欧美一区二区三区久久| 久久天天躁狠狠躁夜夜av| 超薄丝袜一区二区| 红桃视频成人在线观看| 久久精品男人天堂| 欧美裸体男粗大视频在线观看| 亚洲最大福利视频网站| 久久视频在线播放| 岛国精品视频在线播放| 另类色图亚洲色图| 国产精品18久久久久久麻辣| 国产精品一区专区欧美日韩| 亚洲品质视频自拍网| 国产91av在线| 亚洲女同性videos| 97视频在线观看网址| 亚洲性无码av在线| 欧美影院在线播放| 久久人体大胆视频| 国产91精品久久久久| 久久精品亚洲94久久精品| 91免费版网站入口| 综合av色偷偷网| 日韩精品视频在线| 欧美精品一二区| 高清一区二区三区四区五区| 欧洲精品毛片网站| 国产精品mp4| 成人国产精品免费视频| 久久久视频在线| 久久免费在线观看| 精品国产一区二区在线| 性亚洲最疯狂xxxx高清| 综合国产在线视频| 奇米4444一区二区三区| 日韩高清中文字幕| 亚洲男人的天堂网站| 成人免费高清完整版在线观看| 欧美精品999| 久久久久久九九九| 日韩天堂在线视频| 国模极品一区二区三区| 亚洲免费人成在线视频观看| 亚洲第一天堂无码专区| 色综合男人天堂| 欧美xxxx14xxxxx性爽| 国产成人精品久久二区二区| 亚洲日本欧美日韩高观看| 欧美性视频精品| 亚洲人a成www在线影院| 中文字幕日韩欧美精品在线观看| 影音先锋日韩有码| 45www国产精品网站| 久久久久久久久久久亚洲| 久久久精品2019中文字幕神马| 萌白酱国产一区二区| 久久婷婷国产麻豆91天堂| 亚洲国产成人精品女人久久久| 日韩最新在线视频| 欧美日韩国产一中文字不卡| 午夜精品久久久久久99热软件| 国产一区二区三区网站| 97在线视频免费| 欧美一区二区.| 色777狠狠综合秋免鲁丝| 在线观看视频99| 亚洲一区二区三区四区在线播放| 日韩av资源在线播放| 国产在线精品成人一区二区三区| 久久久女人电视剧免费播放下载| 国模精品视频一区二区| 国产精品自在线| 97精品免费视频| 欧美激情免费视频| 色吧影院999| 国产在线播放91| 91久久久精品| 国产精品视频最多的网站| 久久这里只有精品视频首页| 欧美日韩一区二区在线| 亚洲成人免费在线视频| 欧美性少妇18aaaa视频| 姬川优奈aav一区二区| 韩日欧美一区二区| 国产成人免费av| 国产欧美精品一区二区三区介绍| 精品国产31久久久久久| 国产女精品视频网站免费| 在线日韩日本国产亚洲| 亚洲人成网站777色婷婷| 国产亚洲精品一区二555| 欧美麻豆久久久久久中文| 久久久久久噜噜噜久久久精品| 黑人与娇小精品av专区| 97精品欧美一区二区三区| 国产精品久久久精品| 日韩欧美大尺度| 精品国偷自产在线| 亚洲人在线视频| 国产91精品黑色丝袜高跟鞋| 国产精品久久精品| 欧美日韩国产激情| 中文字幕av日韩| 日韩av在线电影网| 亚洲性猛交xxxxwww| 国产原创欧美精品| 久久久精品日本| 国产一区二区在线免费| 国产精品视频xxxx| 国产欧美一区二区三区久久| 中文字幕亚洲无线码在线一区| 久久在线精品视频| 在线成人激情视频| 91在线色戒在线| 欧美在线视频播放| 国产精品视频1区| 欧美一区二区影院| 国产精品久久久久久久久久99| 中文字幕精品一区二区精品| 国产亚洲精品高潮| 亚洲电影免费观看高清完整版| 亚洲综合日韩中文字幕v在线| 久久久综合免费视频| 久久精品国产99国产精品澳门| 国模视频一区二区三区| 国产精品视频播放| 中文字幕成人在线| 精品久久在线播放| 91精品国产网站| 国产精品福利在线观看网址| 欧美黑人狂野猛交老妇| 国产欧美欧洲在线观看| 欧美性猛交xxxx乱大交蜜桃| 中文字幕欧美日韩| 2018中文字幕一区二区三区|