一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - 詳解iOS應用開發中使用設計模式中的抽象工廠模式

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

2021-01-13 16:21Snow Liang IOS

這篇文章主要介紹了iOS應用開發中使用設計模式中的抽象工廠模式,示例代碼為傳統的Objective-C,需要的朋友可以參考下

概述

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

定義

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

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

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

 先對上面結構圖的幾個角色進行說明:

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,這樣,很明顯是違背“開放-關閉原則”。這也是可以理解的,沒有任何一個設計模式是完美沒有瑕疵的,這就好比世界上沒有打不敗的武功一樣。我們可以做的就是在實際的需求中,盡可能的將變化點進行隔離,以達到變化發生的時候,對整個系統的影響最小,變化所帶來的變更和成本最低。

示例

先給大家看一下數據庫訪問的類結構圖吧。

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

好的,簡單分析一下上面這張類結構圖,這張圖中有三個獨立的模塊兒,一個是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;
}


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

延伸 · 閱讀

精彩推薦
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5272021-01-16
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111302021-03-15
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
主站蜘蛛池模板: 日韩国产欧美视频 | 国产精品久久亚洲一区二区 | 国产亚洲女在线精品 | 久久理论片 | 欧美特黄特色aaa大片免费看 | 成人免费在线视频 | 女教师波多野结衣高清在线 | 男男羞羞视频网站国产 | 国产精品中文 | 日韩精品1 | 全彩孕交漫画福利啪啪吧 | 五月香婷婷| 4hu四虎永久网址 | 波多在线 | 深夜影院深a | 日韩免费视频播播 | 国产成人v爽在线免播放观看 | 色中文网 | 国产愉拍精品视频手机 | 国产专区视频在线观看 | 歪歪动漫小说sss | 欧美三级不卡视频 | 亚洲国产高清一区二区三区 | 掰开逼操| 亚洲 欧美 中文 日韩 另类 | 99精品国产高清一区二区三区香蕉 | 91久久精品视频 | 国产乱插| ysav67| 精品国产一区二区三区久久影院 | 亚洲人成网站在线观看90影院 | 亚洲AV久久无码精品九号 | 农村妇女野战bbxxx农村妇女 | 关晓彤一级做a爰片性色毛片 | 亚洲好骚综合 | 亚洲国产在线综合018 | 日韩亚洲国产激情在线观看 | 日本伊人色综合网 | 亚洲精品久久久992KVTV | 亚洲精品在线免费 | 校花被强迫np肉高h 校服下的白嫩小乳尖h1v1 |