何為設(shè)計(jì)模式?
設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉、經(jīng)過(guò)分類(lèi)編碼目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。
設(shè)計(jì)模式的目的何在呢?
設(shè)計(jì)模式是為了可重用代碼,讓代碼更容易被他人理解,并且保證代碼可靠性
iOS簡(jiǎn)單工廠模式
何為簡(jiǎn)單工廠模式?即為由工廠類(lèi)根據(jù)傳入的參數(shù),動(dòng)態(tài)決定應(yīng)該創(chuàng)建出對(duì)應(yīng)的產(chǎn)品類(lèi)的實(shí)例。
簡(jiǎn)單工廠模式主要包含三部分:
1.工廠類(lèi):根據(jù)外界的需要,決定創(chuàng)建并返回哪個(gè)具體的抽象子類(lèi)
2.抽象類(lèi):定義抽象子類(lèi)所需的屬性和方法,子類(lèi)通過(guò)繼承自抽象類(lèi)獲得這些方法
3.抽象子類(lèi):繼承自抽象類(lèi),是具體的操作實(shí)現(xiàn)者。
總的操作流程是:簡(jiǎn)單工廠模式操作對(duì)象的創(chuàng)建,和關(guān)于操作對(duì)象的相關(guān)的業(yè)務(wù)邏輯分離開(kāi),降低操作對(duì)象耦合度。由于工廠類(lèi)只是為外界創(chuàng)建對(duì)象,所以并不需要實(shí)例化工廠類(lèi)對(duì)象,只需要為外界提供類(lèi)方法即可。外界需要什么類(lèi)型的抽象子類(lèi),只需要傳遞對(duì)應(yīng)的參數(shù)即可。
簡(jiǎn)單工廠模式的優(yōu)點(diǎn):
簡(jiǎn)單工廠模式的核心是工廠類(lèi),該類(lèi)中含有必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建什么樣的產(chǎn)品類(lèi)實(shí)例,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任,而僅僅是去負(fù)責(zé)產(chǎn)品的“消費(fèi)”。從而實(shí)現(xiàn)對(duì)責(zé)任的分割,成功解耦合,有利于以后的維護(hù)和擴(kuò)展。
簡(jiǎn)單工廠模式的缺點(diǎn):
由于它集中了所有的產(chǎn)品創(chuàng)建邏輯形成了一個(gè)無(wú)所不知的全能類(lèi),但是當(dāng)所有的類(lèi)不是繼承自同一個(gè)父類(lèi)的時(shí)候擴(kuò)張比較困難
運(yùn)用場(chǎng)景:
簡(jiǎn)單工廠模式主要適用于抽象子類(lèi)的業(yè)務(wù)邏輯相同,但具體實(shí)現(xiàn)不同的情況。不同的操作子類(lèi)執(zhí)行同樣的方法,最后的結(jié)果卻是不同的,這也是多態(tài)的一種表現(xiàn)方式。
代碼舉例:
-------------------工廠控制器.h-----------------------
#import <Foundation/Foundation.h>
@class Animal;
typedef enum : NSUInteger {
dog,
cat,
} myAnimal;
@interface AnimalFactory : NSObject
@property (nonatomic,strong)NSString* name;
+ (Animal *)createAnimal:(myAnimal)type;
@end
----------------------工廠控制器.m---------------------
#import "AnimalFactory.h"
#import "Dog.h"
#import "Cat.h"
@implementation AnimalFactory
- (void)idd{
NSLog(@"%@",self.name);
}
+ (Animal *)createAnimal:(myAnimal)type{
Animal* animal;
switch (type) {
case dog:
animal = [[Dog alloc]init];
break;
case cat:
animal = [[Cat alloc]init];
break;
default:
break;
}
return animal;
}
@end
------------------動(dòng)物.h------------------------
#import<Foundation/Foundation.h>
@interface Animal : NSObject
@property (nonatomic,strong)NSString* name;
- (void)postRequestOfEast;
@end
------------------動(dòng)物.m------------------------
#import "Animal.h"
@implementation Animal
-(void)postRequestOfEast{
}
@end
------------------動(dòng)物的子類(lèi)-狗.h---------------
#import "Animal.h"
@interface Dog : Animal
@end
------------------動(dòng)物的子類(lèi)-狗.m---------------
#import "Dog.h"
@implementation Dog
-(void)postRequestOfEast{
NSLog(@"%@餓了",self.name);
}
@end
------------------動(dòng)物的子類(lèi)-貓.h---------------
#import "Animal.h"
@interface Cat : Animal
@end
------------------動(dòng)物的子類(lèi)-貓.m---------------
#import "Cat.h"
@implementation Cat
-(void)postRequestOfEast{
NSLog(@"%@餓了",self.name);
}
@end
小結(jié):
利用簡(jiǎn)單的工廠模式,就是哪一天我們這里又要增加很多小動(dòng)物,添加起來(lái)也很方便,只需要繼續(xù)繼承Animal,然后針對(duì)這一動(dòng)物特性進(jìn)行甄別。之前的代碼,我們只用了面向?qū)ο蟮娜齻€(gè)特性之一:封裝,但是現(xiàn)在我們又多用了多態(tài)和繼承。這樣成功解耦合,也是很有利于以后的維護(hù)和擴(kuò)展的。