iOS設(shè)計模式-工廠模式

關(guān)于工廠模式,有很多新加入的朋友不太理解這種模式的好處迂尝,覺得是增加了代碼數(shù)量。這里簡單講解一下我個人看法
  • 首先剪芥,工廠模式是符合開閉原則的垄开,其對擴(kuò)展開放,對修改關(guān)閉税肪。能夠有效解耦
  • 其次溉躲,在復(fù)雜情況下能方便我們理清思路,能將共有特性于獨有特性分離寸认,這種情況下能減少代碼數(shù)量签财,同時方便后期修改。

這里上一個簡單的動物貓狗案例

  • 建議在看的時候偏塞,先自己思考一下這個例子中唱蒸,這個Animal類起到了有什么作用,有沒有意義灸叼。
OC版本
  • Animal.h文件
#import <Foundation/Foundation.h>

@interface Animal : NSObject
@property(nonatomic, copy)NSString * name;
@property(nonatomic, assign)NSInteger age;

- (void)printSelf;

- (void)haveFun;
@end
  • Animal.m文件
#import "Animal.h"

@implementation Animal
- (void)haveFun {
    NSLog(@"%ld歲的%@在玩耍",self.age,self.name);
}

- (void)printSelf {
    NSLog(@"%ld歲的動物%@",self.age,self.name);
}

-(void)setAge:(NSInteger)age {
    if (age >= 0) {
        _age = age;
    } else {
        _age = 0;
    }
}

- (void)setName:(NSString *)name {
    if (name == nil) {
        _name = @"";
    } else {
        _name = name;
    }
}
@end
  • Cat.h文件
#import "Animal.h"

@interface Cat : Animal
+ (instancetype)createCatWithName:(NSString *)name Age:(NSInteger)age;
@end
  • Cat.m文件
#import "Cat.h"

@implementation Cat
+ (instancetype)createCatWithName:(NSString *)name Age:(NSInteger)age {
    Cat * newCat = [[Cat alloc]init];
    newCat.name = name;
    newCat.age = age;
    return newCat;
}

- (void)printSelf {
    NSLog(@"%ld歲的小貓%@",self.age, self.name);
}
@end
  • Dog.h文件
#import "Animal.h"

@interface Dog : Animal
+ (instancetype)createDogWithName:(NSString *)name Age:(NSInteger)age;
@end
  • Dog.m文件
#import "Dog.h"

@implementation Dog
+ (instancetype)createDogWithName:(NSString *)name Age:(NSInteger)age {
    Dog * newDog = [[Dog alloc]init];
    newDog.name = name;
    newDog.age = age;
    return newDog;
}


- (void)printSelf {
    NSLog(@"%ld歲的小狗%@",self.age, self.name);
}
@end
  • 調(diào)用
Animal * dog = [Dog createDogWithName:@"小灰" Age:2];
Animal * cat = [Cat createCatWithName:@"小花" Age:1];

[dog printSelf];
[dog haveFun];
    
[cat printSelf];
[cat haveFun];

swift版本
  • Animal.swift文件
import UIKit

class Animal: NSObject {
    var name : String = ""
    var age : Int = 0 {
        didSet {
            if age < 0 {
                age = 0
            }
        }
    }
    
    func haveFun() {
        print("\(self.age)歲的\(self.name)在玩耍")
    }
    
    func printSelf() {
        print("\(age)的動物\(name)")
    }

}
  • Cat.swif文件
import UIKit

class Cat: Animal {
    static func createCat(name aName : String, age aAge : Int) -> Cat {
        let newCat = Cat.init()
        newCat.name = aName
        newCat.age = aAge
        return newCat
    }
    
    override func printSelf() {
        print("\(self.age)歲的小貓\(self.name)")
    }
    
}
  • Dog.swift文件
import UIKit

class Dog: Animal {
    static func createDog(name aName : String, age aAge : Int) -> Dog {
        let newDog = Dog.init()
        newDog.name = aName
        newDog.age = aAge
        return newDog
    }
    
    override func printSelf() {
        print("\(self.age)歲的小狗\(self.name)")
    }
}
  • 調(diào)用
let dog = Dog.createDog(name: "小灰", age: 2)
let cat = Cat.createCat(name: "小花", age: 1)
        
dog.haveFun()
dog.printSelf()
        
cat.haveFun()
cat.printSelf()
  • 上面我建議大家思考的問題不知道大家有沒有答案神汹,這里其實我的本意是要說,Animal有一個共有的方法 haveFun 古今,在Animal中實現(xiàn)后屁魏,其它子類中就不需要再實現(xiàn)了。
  • 這個例子可能不是實際開發(fā)中的捉腥,大家感觸不深氓拼,下面舉一個我實際項目中的運(yùn)用實例



    可以看到圖中cell有三種樣式(當(dāng)然,你要說是兩種樣式也行抵碟,不必糾結(jié))桃漾,但其中有的共同點是都有點贊按鈕和分享,并且這里點贊和分享是都可以點擊的(不要問我為啥有這種奇葩設(shè)計??)拟逮。
    那么 這里就可以吧cell設(shè)計一個父類撬统,點贊按鈕和分享按鈕在父類中處理,其它布局就在自己單獨的子類中去處理敦迄。那么恋追,這種情況中凭迹,這種做法就可以將邏輯處理與布局分開。很好的實現(xiàn)了解耦苦囱。
    并且嗅绸,在后期項目中,如果他要添加樣式沿彭,只需要再添加一個子類就可以了朽砰,非常清晰明了尖滚。
    歡迎大家提出自己的見解喉刘,大家共同成長。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漆弄,一起剝皮案震驚了整個濱河市睦裳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撼唾,老刑警劉巖廉邑,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異倒谷,居然都是意外死亡蛛蒙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門渤愁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牵祟,“玉大人,你說我怎么就攤上這事抖格∨灯唬” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵雹拄,是天一觀的道長收奔。 經(jīng)常有香客問我,道長滓玖,這世上最難降的妖魔是什么坪哄? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮势篡,結(jié)果婚禮上翩肌,老公的妹妹穿的比我還像新娘。我一直安慰自己殊霞,他們只是感情好摧阅,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绷蹲,像睡著了一般棒卷。 火紅的嫁衣襯著肌膚如雪顾孽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天比规,我揣著相機(jī)與錄音若厚,去河邊找鬼。 笑死蜒什,一個胖子當(dāng)著我的面吹牛测秸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灾常,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霎冯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钞瀑?” 一聲冷哼從身側(cè)響起沈撞,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雕什,沒想到半個月后缠俺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡贷岸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年壹士,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偿警。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡躏救,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出户敬,到底是詐尸還是另有隱情落剪,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布尿庐,位于F島的核電站忠怖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抄瑟。R本人自食惡果不足惜凡泣,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望皮假。 院中可真熱鬧鞋拟,春花似錦、人聲如沸惹资。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褪测。三九已至猴誊,卻和暖如春潦刃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懈叹。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工乖杠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澄成。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓胧洒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親墨状。 傳聞我的和親對象是個殘疾皇子卫漫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容