iOS設(shè)計(jì)模式(工廠方法)

工廠模式也稱為虛構(gòu)造器窃诉,它適用于:一個(gè)類無法預(yù)期生成那個(gè)類對象耳鸯,想讓其子類來指定所生成具體對象榨乎。

工廠模式總體在同一類型差異性較小的子類之間以抽象基類作為其返回類型來適應(yīng)未來新增產(chǎn)品的動態(tài)調(diào)整丁屎,由于具有同樣的接口鲁沥,我們可以在新增產(chǎn)品類型時(shí)盡可能保障原有客戶端代碼邏輯的穩(wěn)定性呼股。同時(shí),由于各自類型的產(chǎn)品的初始化方案都已隔離進(jìn)各自的工廠方法中画恰,避免了牽一發(fā)而動其身的尷尬境地彭谁。

簡單工廠

簡單工廠模式不屬于23種GOF設(shè)計(jì)模式之一。它也稱作靜態(tài)工作方法模式允扇,是工廠方法模式的特殊實(shí)現(xiàn)(也就是說工廠模式包含簡單工廠模式)缠局。這里對簡單工廠模式進(jìn)行介紹,是為后面的工廠方法和抽象工廠模式做一個(gè)引子考润。

OC

typedef NS_ENUM(NSInteger) {
    kApple,
    kOrange,
    kBanana
} FruitsType;

@interface FruitsFactory : NSObject
// 創(chuàng)造水果的工廠
+ (Fruits *)fruitsFactory:(FruitsType)type;

@end

@implementation FruitsFactory
+ (Fruits *)fruitsFactory:(FruitsType)type {
    // 創(chuàng)建空的對象.在工廠方法里面進(jìn)行水果的制造
    Fruits *fruits = nil;
    
    switch (type) {
        case kApple:
            fruits = [[Apple alloc] init];
            break;
        case kOrange:
            fruits = [[Orange alloc] init];
            break;
        case kBanana:
            fruits = [[Banana alloc] init];
        default:
            break;
    }
    return fruits;
}
@end

@interface Fruits : NSObject
- (void)sweet; /**< 甜 */
- (void)poorTaste; /**< 不好吃 */
@end

@implementation Fruits
- (void)sweet {
    
}

- (void)poorTaste {
    
}
@end

@interface Banana : Fruits

@end

@implementation Banana
// 甜
- (void)sweet {
    NSLog(@"Banana 非常甜");
}

// 不好吃
- (void)poorTaste {
    NSLog(@"Banana 不好吃");
}
@end


@interface Apple : Fruits
- (void)freshApple; /**< 新鮮的蘋果 */   
@end

@interface Apple : Fruits
- (void)freshApple; /**< 新鮮的蘋果 */   
@end

@implementation Apple
// 甜
- (void)sweet {
    NSLog(@"Apple 非常甜");
}

// 不好吃
- (void)poorTaste {
    NSLog(@"Apple 不好吃");
}

// 新鮮的蘋果
- (void)freshApple {
    NSLog(@"Apple 新鮮的蘋果");
}
@end


@interface Orange : Fruits
- (void)acidOrange; /**< 酸橘子 */
@end

@implementation Orange
// 甜
- (void)sweet {
    NSLog(@"Orange 非常甜");
}

// 不好吃
- (void)poorTaste {
    NSLog(@"Orange 不好吃");
}

/**< 酸橘子 */
- (void)acidOrange {
    NSLog(@"Orange 有點(diǎn)酸");
}
@end


##################
 // 在水果工廠里面創(chuàng)建出蘋果
    Fruits *fruits = [FruitsFactory fruitsFactory:kApple];
    [fruits sweet];
    
    // 在水果工廠里面創(chuàng)建出蘋果, 調(diào)用私有的方法
    Apple *apple = (Apple *)[FruitsFactory fruitsFactory:kApple];
    [apple freshApple];


Swift

enum KFruitsType {
    case kBanana,kApple,KOrange
}


class KFruitsFactory: NSObject {
  static func fruitsFactory(type:KFruitsType) ->KFruits{
        switch type {
        case .kBanana:
            return kBanana()
        case .kApple:
            return kBanana()
        case .KOrange:
            return KOrange()
        }
        
    }
    
}

class KFruits: NSObject {
    func sweet(){
        
    }
    func poorTaste(){
        
    }
}

class kBanana: KFruits {
   override func sweet(){
    print("Banana 非常甜")
    }
   override func poorTaste(){
    print("Banana 不好吃")
    }
}

class kApple: KFruits {
    func freshApple(){
       print("freshApple")
    }
    
    override func sweet(){
        print("kApple 非常甜")
    }
    override func poorTaste(){
        print("kApple 不好吃")
    }
    
}
class KOrange: KFruits {
    override func sweet(){
        print("KOrange 非常甜")
    }
    override func poorTaste(){
        print("KOrange 不好吃")
    }
    
}

工廠方法(Factory Method)

@interface ColorViewGenerator : NSObject

- (ColorView *)colorViewWithFrame:(CGRect)frame;

@end

@implementation ColorViewGenerator

- (ColorView *)colorViewWithFrame:(CGRect)frame {
    return [[ColorView alloc] initWithFrame:frame];
}

@end

@interface RedViewGenerator : ColorViewGenerator

@end
@implementation RedViewGenerator

- (ColorView *)colorViewWithFrame:(CGRect)frame {
    return [[RedView alloc] initWithFrame:frame];
}

@end
@interface BlueViewGenerator : ColorViewGenerator

@end
@implementation BlueViewGenerator

- (ColorView *)colorViewWithFrame:(CGRect)frame {
    return [[BlueView alloc] initWithFrame:frame];
}

@end


@interface ColorView : UIView

@end
@implementation ColorView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setBackgroundColor:[UIColor grayColor]];
    }
    return self;
}

@end

@interface BlueView : ColorView

@end
@implementation BlueView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor blueColor];
        
        UIImage *backgroundImage = [UIImage imageNamed:@"tupian2"];
        UIImageView *backgroundView = [[UIImageView alloc] initWithImage:backgroundImage];
        [self addSubview:backgroundView];
    }
    return self;
}


@end


@interface RedView : ColorView

@end
@implementation RedView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor redColor];
        
        UIImage *backgroundImage = [UIImage imageNamed:@"tupian"];
        UIImageView *backgroundView = [[UIImageView alloc] initWithImage:backgroundImage];
        [self addSubview:backgroundView];
    }
    return self;
}

@end


#######
 ColorViewGenerator *colorGen = [[RedViewGenerator alloc] init];
    CGRect rect = CGRectMake(0, 0, 300, 600);
    ColorView *red = [colorGen colorViewWithFrame:rect];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狭园,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子糊治,更是在濱河造成了極大的恐慌妙啃,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揖赴,居然都是意外死亡馆匿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門燥滑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渐北,“玉大人,你說我怎么就攤上這事铭拧≡咧耄” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵搀菩,是天一觀的道長呕臂。 經(jīng)常有香客問我,道長肪跋,這世上最難降的妖魔是什么歧蒋? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮州既,結(jié)果婚禮上谜洽,老公的妹妹穿的比我還像新娘。我一直安慰自己吴叶,他們只是感情好阐虚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚌卤,像睡著了一般实束。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逊彭,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天咸灿,我揣著相機(jī)與錄音,去河邊找鬼诫龙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲫咽,可吹牛的內(nèi)容都是我干的签赃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼分尸,長吁一口氣:“原來是場噩夢啊……” “哼锦聊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箩绍,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤孔庭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圆到,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怎抛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芽淡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片马绝。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挣菲,靈堂內(nèi)的尸體忽然破棺而出富稻,到底是詐尸還是另有隱情,我是刑警寧澤白胀,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布椭赋,位于F島的核電站,受9級特大地震影響或杠,放射性物質(zhì)發(fā)生泄漏哪怔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一廷痘、第九天 我趴在偏房一處隱蔽的房頂上張望蔓涧。 院中可真熱鬧,春花似錦笋额、人聲如沸元暴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茉盏。三九已至,卻和暖如春枢冤,著一層夾襖步出監(jiān)牢的瞬間鸠姨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工淹真, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讶迁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓核蘸,卻偏偏與公主長得像巍糯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子客扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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