1. 程式人生 > >Objective-C常用設計模式(一)--工廠方法模式

Objective-C常用設計模式(一)--工廠方法模式

工廠方法模式:定義建立物件的介面,讓子類決定例項化哪一個類。工廠方法使得一個類的例項化延遲到其子類。幾乎所有面向物件語言寫的應用程式都能看到工廠方法。“專門定義一個類來負責建立其他類的例項,被建立的例項通常具有共同的父類。”工廠方法模式使用場景:
  • 編譯時無法準確預期要建立的物件的類;
  • 類想讓其子類決定在執行時建立什麼;
  • 類有若干輔助類為其子類,而你想將返回哪個子類這一資訊區域性化

結構圖:


ConcreteProduct1ConcreteProduct2兩個產品具有一個共同的父類IProject,簡單工廠類為SimpleFactory,負責根據傳入的不同引數來決定生產ConcreteProduct1還是

ConcreteProduct2產品。

程式碼例子如下:

Animal 類

@interface Animal :NSObject

@proterty(nonatomic,strong) NSString *name;

-(void)laugh;

@end

Dog類

@interface Dog:Animal

@end

Cat類

@interface Cat:Animal

@end

建立物件的工廠類

.h

@interface AnimalFactory:NSObject

+(Dog *)createDog;

+(Cat *)createCat;

@end

.m

@implementation AnimalFactory

+(Dog *)createDog{

    Dog *dog=[[Dog alloc]init];

    [email protected]“baby”;

    return dog;

}

+(Cat *) createCat{

    Cat *cat=[[Cat alloc]init];

    return cat;

}

Main.m檔案

Dog *dog=[AnimalFactory createDog];

Cat *cat=[AnimalFactory createCat];

這是簡單工廠模式

現在建立100個Dog物件,如果這100個物件寫在程式中的不同地方,按上邊的方法是需要把Dog *dog=[AnimalFactory createDog];這一句話寫在程式中很多不同的地方,那麼現在有一個需求,就是如果需要把這些建立的100個Dog物件全部變成Cat物件,那麼按照剛才的那個做法,就需要在這100句程式碼中把createDog方法變成createCat方法了,這樣做還是很複雜

那麼這個時候用工廠方法模式就能解決這個難題了

工廠方法模式是為每一個要建立的物件所在的類都相應地建立一個工廠

程式碼如下

@interface AnimalFactory:NSObject

-(Animal*)createAnimal;

@end;

Dog工廠類

@interface DogFactory:AnimalFactory;

@implementation DogFactory

-(Animal *)createAnimal{

retrurn [[Dog alloc]init];

}

@end

Cat工廠類

@interface CatFactory:AnimalFactory;

@implementation Cat Factory

-(Animal *)createAnimal

retrurn [[Cat alloc]init];

}

@end

Main.m

AnimalFactory *dogFactory=[[DogFactory alloc]init];

Animal *animal1=[dogFactory createAnimal];

[animal1 laugh];

Animal *animal2=[dogFactory createAnimal];

[animal2 laugh];

…….

Animal *animal100=[dogFactory createAnimal];

[animal100 laugh];

這樣話如果要把100個Dog改為Cat的話,只需要吧DogFactory改為CatFactory就可以了

但是工廠方法也有它的限制:

1.要建立的類必須擁有同一個父類

2.要建立的類在100個不同的地方所呼叫的方法必須一樣

例子 


從最簡單的簡單工廠模式開始學起,舉一個實現計算器的例子,來完成簡單工廠模式。

一個簡單計算器,用四則運算來考慮的話,加減乘除,那麼初學者會覺得很簡單,用if條件來進行判斷,判斷好了之後就可以完成要求,而稍微有經驗點的 可能會選擇switch case的判斷方式,例如下面的程式碼:

Operation運算方法的邏輯

- (void)operationWithnumberA:(double )numberA Withoperator:(char)operator WithnumberB:(double )numberB
{
/**
 *  封裝了一個傳遞值的方法
 *
 *  @param numberA  數字A
 *  @param operator 運算子
 *  @param numberB  數字B
 */
    double result = 0;
    
    switch (operator) {
        case 'a':
        result = numberA + numberB;
            break;
            
        case 'b':
            result = numberA - numberB;
            break;
            
        case 'c':
            result = numberA * numberB;
            break;
            
            case 'd':
            if (numberB == 0) {
                NSLog(@"除數不能為0 請重新輸入");
            }else{
                result = numberA / numberB;
            }
            
            case 'e':
            NSLog(@"退出");
            break;
            
        default:
            break;
    }

而客戶端方面的程式碼 我們可以這麼寫

/**
 *  四則運算
 */
- (void)operation

{
    char a ;
    
    double numberA;
    NSLog(@"請輸入數字A");
    scanf("%lf",&numberA);
    double numberB;
    NSLog(@"請輸入數字B");
    scanf("%lf",&numberB);
    
    NSLog(@"加法請輸入a");
    NSLog(@"減法請輸入b");
    NSLog(@"乘法請輸入c");
    NSLog(@"除法請輸入d");
    NSLog(@"退出請輸入e");
    
    scanf("%c",&a);
    
    [self operationWithnumberA:numberA Withoperator:a WithnumberB:numberB];  
}

在我們得到需要的數值之後,呼叫運算方法做判斷,算出結果。

這樣寫就會比if的判斷清晰,因為我們已經把業務邏輯和介面顯示的部分完全分離了,在任何需要用到的地方,我們就可以直接複製這段程式碼,完成運算。

但是假如,我有一天的運算需求不滿足於四則運算,而是希望加上開根號或者平方的運算方法,該怎麼辦。難道我們還要回頭,去switch語句裡再加判斷條件,之後在介面上增加提示麼?

之前的程式碼,我們只用到了面向物件的三個特性之一,就是封裝,而解決我上一段話提出的疑問,我們可以用到另外兩個特性,多型和繼承來實現。

為了實現之前的要求,在不改動其他程式碼的情況下,能夠增加更多的運算方法,或者修改出問題的運算方法。那麼我們首先先把四則運算,封裝成四個類,即為加法類、減法類、乘法類、除法類。


@implementation AddOperation
/**
 *   加法
 */
+ (double)addOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
    double result = 0;
    
    result = numberA + numberB ;
    
    NSLog(@"%f",result);

    return result;
}




@implementation SubOperation

/**
 *   減法
 */
+ (double)subOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
    double result = 0;
    
    result = numberA - numberB ;
    
     NSLog(@"%f",result);
    
    return result;
}


@implementation MulOperation

/**
 *   乘法
 */
+ (double)mulOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
    double result = 0;
    
    result = numberA * numberB ;
    
     NSLog(@"%f",result);
    
    return result;
}

@implementation DivOperation

/**
 *   除法
 */
+ (double)divOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
    double result = 0;
    
    if (numberB == 0) {
        NSLog(@"除數不能為0 請重新輸入");
    }else{
        result = numberA / numberB;
    }
    
     NSLog(@"%f",result);
    
    return result;
}

這樣我們就已經把四則運算,封裝成了四個類。因為偷懶,我並沒有設計介面模型,只是把結果輸出來,所以每段輸出結果的NSLog請不要介意。

接下來,我們在簡單工廠的Operation類中,把呼叫這四個類的運算方法實現。


/**
 *  封裝了一個運算方法
 *
 *  @param numberA  數字A
 *  @param operator 運算子
 *  @param numberB  數字B
 */
+ (void)operationWithnumberA:(double )numberA Withoperator:(char)operator WithnumberB:(double )numberB
{
    
    switch (operator) {
        case 'a':
            [AddOperation addOperationWithNumberA:numberA WithNumberB:numberB];
            break;
            
        case 'b':
            [SubOperation subOperationWithNumberA:numberA WithNumberB:numberB];
            break;
            
        case 'c':
            [MulOperation mulOperationWithNumberA:numberA WithNumberB:numberB];
            break;
            
        case 'd':
            [DivOperation divOperationWithNumberA:numberA WithNumberB:numberB];
            break;
        case 'e':
            NSLog(@"退出");
            break;
            
        default:
            break;
    }  
}

以上就是在簡單工廠的類中,呼叫四個運算方法的類,來實現運算,並且成功解耦合,有利於以後的維護和擴充套件。客戶端方面的程式碼也就非常簡單。


/**
 *  四則運算
 */
- (void)operation

{
    char a = 'a';
    
    double numberA = 10;
    
    double numberB = 20;
    
    
//    NSLog(@"加法請輸入a");
//    NSLog(@"減法請輸入b");
//    NSLog(@"乘法請輸入c");
//    NSLog(@"除法請輸入d");
//    NSLog(@"退出請輸入e");
    
    
    [Operation operationWithnumberA:numberA Withoperator:a WithnumberB:numberB];

}

有更好的請給我推薦推薦 謝謝。學習ing


相關推薦

Objective-C常用設計模式--工廠方法模式

工廠方法模式:定義建立物件的介面,讓子類決定例項化哪一個類。工廠方法使得一個類的例項化延遲到其子類。幾乎所有面向物件語言寫的應用程式都能看到工廠方法。“專門定義一個類來負責建立其他類的例項,被建立的例項通常具有共同的父類。”工廠方法模式使用場景:編譯時無法準確預期要建立的物件

java設計模式---工廠方法模式

基本上有興趣瞭解設計模式的都會知道工廠模式,因為各種模式相關的書籍以及部落格什麼的都是以工廠模式開頭的,對於一時興起或者三天熱度的都是會看到工廠模式,但是工廠模式也是用到比較廣泛的模式,屬於建立型模式。工廠模式分為工廠方法模式和抽象工廠模式,這篇主要總結一下工廠

Java面向物件設計模式——工廠方法模式

工廠方法模式(Factory Method) 工廠方法模式分為三種: 1、普通工廠模式,就是建立一個工廠類,對實現了同一介面的一些類進行例項的建立。首先看下關係圖: 舉例如下:(我們舉一個傳送郵件和簡訊的例子) 首先,建立二者的共同介面: publici

java23種設計模式工廠方法模式

在說工廠方法模式之前,先了解一下簡單工廠模式。工廠方法模式其實是在簡單工廠上面做了一些增強。 簡單工廠模式:有一個專門的類來生產其他類的例項,生產的這些例項有一個共同父類。這個跟我們的多型有一點像。 例子: 假如我們有一個滑鼠工廠,這個工廠既可以生產聯想滑鼠,又可以生產巨集碁滑鼠。 程式碼如下: 1、滑鼠工廠

常用軟體設計模式工廠方法模式

工廠方法模式:定義一個用於建立物件的介面,讓其子類決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。 優點:1、一個呼叫者想建立一個物件,只要知道其名稱就可以了           

設計模式---工廠方法模式

ack cto sys alt 修改 spa 抽象類 .com desc 1、簡介:工廠方法模式是類的創建模式,又叫虛擬構造子模式或是多態性工廠模式,它的實現方式是創建一個工廠接口,將實際創建對象的的工作轉移到工廠子類中,在系統的擴展中,可以在不修改工廠角色的情況下引進新的

設計模式工廠方法模式

想想我們之前的簡單工廠模式,是這樣的: 結構圖: 工廠類: class OperationFactory{ public static Operation createOperate(string operate){ Operation

常用的軟體設計模式單例模式

單例模式:即一個類只有一個例項,在類裡自己建立自己的例項。 優點: (1)單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。 (2)因為類控制了例項化過程,所以類可以靈活更改例項化過程。尤其是在C++中,每次new都要delete,而是用單例模式可以避免

C++設計模式——建立型模式

     設計模式指導我們怎樣去建立、維護、分配面向物件系統中的實體類, 以獲得高內聚、低耦合的面向物件系統,從而提高系統的可維護性和可複用性。設計模式是OO的一些設計思想的一個總結(但不是全部),因此設計模式和OO的設計原則經驗沒有矛盾,而是殊

C/C++語法淺談二十三種設計模式——工廠模式Factory Method

0.寫在前面 在軟體開發過程中,為了提高開發效率、增強軟體執行的穩定性,降低後期專案維護的成本,我們志在追求更加高效、簡單的設計思路來引領我們的專案產品,在經過不斷的探索與總結的過程中,我們最常用的設計模式有23中,總體分為三大類,即建立型模式、結構型模式和行為型模式,具體如下:

設計模式觀察者模式

針對 ray 需求 als bool 模式 null rri 主動 觀察者模式 定義了對象之間的一對多的依賴,這樣一來,當一個對象狀態改變時,他的 多有依賴都會受到通知並自動更新。 本例為一個溫度基站,和三個終端。溫度基站為廣播類WeatherData,三個終端監聽者類分別

Swift 4 和 Objective-C 混合編程 快速起步

命名方式 import 編譯器 選擇性 工程 Swift 4 和 Objective-C 在同一個工程裏的混搭編程的方法你可以在 xcode 裏同時使用 Swift 和 Objective-C(以下簡稱OC)來寫代碼,混搭編程的好處很多,比如允許大量代碼的復用,在性能和開發效率之間找到平衡

android深入之設計模式托付模式

-h listen back != new 聚合 string static data- (一)托付模式簡單介紹 托付模式是主要的設計模式之中的一個。托付。即是讓還有一個對象幫你做事情。 更多的模式,如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了托

設計模式工廠模式

inside 類和對象 ace square 種類型 創建 實體類 需要 服務器 工廠模式 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。 在工廠模式中,我們在創建對象時不會

設計模式單例模式

分享 公有 交互 線程 加鎖 解決 操作 編譯 進入 1.單例模式(Singleton):由於某種需要,要保證一個類在程序的生命周期中只有一個實例,並提供一個該實例的全局訪問方法。 2.單例模式(Singleton)結構圖: Singleton類,定義了一個GetInst

設計模式建造者模式

單實例 抽象類 原型 sys 數組 組合 cto 簡單 builder GOF論述了23種設計模式,它們有3個分類————創建型模式、結構型模式、行為模式。此篇為創建型模式創建型模式抽象了實例化的過程,它們可以幫助某個系統獨立於如何創建、組合以及表示該系統所包含的對象。當系

跟著別人學設計模式-----單例模式詳解

    作者:zuoxiaolong8810(左瀟龍),轉載自:http://www.cnblogs.com/zuoxiaolong/p/pattern2.html             上一章

設計模式單例模式詳解

愉快的開始自己的技術積累 ,設計模式中使用最普遍的單例模式開始; 設計模式中最為大家熟悉的必須是單例模式,專案中 必須 使用到的套路。首先陳述下我對 框架,模式的一些理解。   從學校出來,開始面試的時候張口框架,閉口模式,真的問道什麼是框架,我只能死鴨子嘴硬的強調 MVC ,

PHP設計模式——單例模式Singleton Pattern

PHP設計模式(一)——單例模式(Singleton Pattern) 單例模式(Singleton Pattern):顧名思義,就是隻有一個例項。作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 (一)為