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

來源:互聯網
上載者:User

概述

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

定義

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

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

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

AbstractFactory:抽象工廠介面,裡面應該包含所有產品建立的抽象方法;
ConcreteFactory1和ConcreteFactory2:具體的工廠,建立具有特定實現的產品對象;
AbstractProductA和AbstractProductB:抽象產品,它們可能有多種不同的實現方式;
ProductA1、ProductA2、ProductB1和ProductB2:具體的產品,是抽象產品的具體實現。
  從結構圖中可以看到,抽象Factory 方法最大的好處是能夠很方便的變換產品系列(例如id<AbstractFactory> factory =[ [ConcreteFactory1 alloc] init],只需要將ConcreteFactory1換成ConcreteFactory2,就可以建立ProductA2和ProductB2)。另外,抽象Factory 方法讓具體的建立執行個體過程與用戶端分離,用戶端是通過它們的抽象介面操作執行個體,產品的具體類名也被具體工廠的實現分離,不會出現在客戶代碼中(例如id<AbstractProductA> product = [factory createProductA],用戶端根本不知道具體的類名是ProductA1還是ProductA2)。

  但是,抽象Factory 方法也是存在缺點的,比如說現在我們要增加一個新的產品,首先,我們需要增加三個類: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;
}


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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.