設(shè)計模式系列文章
《iOS設(shè)計模式(1)簡單工廠模式》
《iOS設(shè)計模式(3)適配器模式》
《iOS設(shè)計模式(4)抽象工廠模式》
《iOS設(shè)計模式(5)策略模式》
《iOS設(shè)計模式(6)模板模式》
《iOS設(shè)計模式(7)建造者模式》
承接上文
1.概念描述
工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統(tǒng)可以說是隨處可見。因為工廠模式就相當(dāng)于創(chuàng)建實例對象的new,我們經(jīng)常要根據(jù)類Class生成實例對象,如A a=new A() 工廠模式也是用來創(chuàng)建實例對象的,所以以后new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統(tǒng)帶來更大的可擴展性和盡量少的修改量。---百度百科
以上是百度百科對工廠模式的描述,大家參考一下。上一篇文章咱們看了工廠模式的一種特殊實現(xiàn):簡單工廠模式。文章中也提到了,簡單工廠類中揉雜了太多的業(yè)務(wù)邏輯,耦合度太高了。
制作牌子的公務(wù)員賴洋洋的抱怨:“什么牌子的都送我這來,想累死老子嗎?哪天老子一生氣把黃牌號制成藍牌號別怪我!” 天朝的公務(wù)員就是這樣牛逼,不過他說的也對。于是領(lǐng)導(dǎo)順?biāo)浦鄢脵C安排了某個親戚家的人來專門制作黃牌子,這樣兩個人分工明確了,也不會出現(xiàn)失誤了,一舉兩得。那代碼中咱們怎樣實現(xiàn)業(yè)務(wù)邏輯分離解耦呢?下面看代碼
2.代碼實現(xiàn)
我們要解決的糟糕代碼是這個地方
#import <Foundation/Foundation.h>
@class LHCarLicense;
typedef enum : NSUInteger {
ELicenseType_Blue,
ELicenseType_Yellow
} ELicenseType;
@interface LHCarLicenseFactory : NSObject
/**
* 獲取牌照工廠
*
* @param type 牌照類型
*
* @return 返回牌照對象
*/
+ (LHCarLicense *)createCarLicenseWithType:(ELicenseType)type;
@end
#import "LHCarLicenseFactory.h"
#import "LHCarLicense.h"
#import "LHBlueCarLicense.h"
#import "LHYellowCarLicense.h"
@implementation LHCarLicenseFactory
+ (LHCarLicense *)createCarLicenseWithType:(ELicenseType)type{
LHCarLicense *_license;
switch (type) {
case ELicenseType_Blue:
_license = [[LHBlueCarLicense alloc] init];
break;
case ELicenseType_Yellow:
_license = [[LHYellowCarLicense alloc] init];
break;
}
return _license;
}
@end
那個該怎樣解耦呢,我們前面說了,工廠類中摻雜了業(yè)務(wù)邏輯,那就要把業(yè)務(wù)邏輯抽離,怎樣抽離?我們的思路的是實現(xiàn)一個基類工廠,然后再分別派生出藍牌工廠和黃牌工廠,然他們各自實現(xiàn)自己的業(yè)務(wù)邏輯,這樣相互之間業(yè)務(wù)變動不會影響彼此,擴展新的業(yè)務(wù)也不會影響到既有業(yè)務(wù),下面看具體代碼實現(xiàn):
定義基類工廠,將之前的工廠類修改為下面這樣:
#import <Foundation/Foundation.h>
@class LHCarLicense;
@interface LHCarLicenseFactory : NSObject
/**
* 獲取牌照工廠
*
* @param type 牌照類型
*
* @return 返回牌照對象
*/
+ (LHCarLicense *)createCarLicense;
@end
#import "LHCarLicenseFactory.h"
#import "LHCarLicense.h"
@implementation LHCarLicenseFactory
+ (LHCarLicense *)createCarLicense{
return nil;
}
@end
然后派生藍牌工廠類和黃牌工廠類
#import "LHCarLicenseFactory.h"
@interface LHBlueCarLicenseFactory : LHCarLicenseFactory
@end
#import "LHBlueCarLicenseFactory.h"
#import "LHBlueCarLicense.h"
@implementation LHBlueCarLicenseFactory
+ (LHCarLicense *)createCarLicense
{
LHBlueCarLicense *_blueCarLicense = [[LHBlueCarLicense alloc] init];
return _blueCarLicense;
}
@end
#import "LHCarLicenseFactory.h"
@interface LHYellowCarLicenseFactory : LHCarLicenseFactory
@end
#import "LHYellowCarLicenseFactory.h"
#import "LHYellowCarLicense.h"
@implementation LHYellowCarLicenseFactory
+ (LHCarLicense *)createCarLicense
{
LHYellowCarLicense *_blueCarLicense = [[LHYellowCarLicense alloc] init];
return _blueCarLicense;
}
@end
ok,這樣就把原來耦合的業(yè)務(wù)邏輯剝離出去了,這樣的代碼邏輯清晰,層面分明、擴展性也好。客戶端調(diào)用代碼只需做如下修改
#import "ViewController.h"
#import "LHCarLicense.h"
#import "LHCarLicenseFactory.h"
#import "LHBlueCarLicenseFactory.h"
#import "LHYellowCarLicenseFactory.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
#pragma mark -
#pragma mark Button Event
// 生成藍色牌照
- (IBAction)btnBlueEvent:(UIButton *)sender {
LHCarLicense *_license = [LHBlueCarLicenseFactory createCarLicense];
_license.city = _txtCity.text ? _txtCity.text : @"京";
_lbLicenseNumber.text = [_license printLicenseNumber];
}
// 生成黃色牌照
- (IBAction)btnYellowEvent:(UIButton *)sender {
LHCarLicense *_license = [LHYellowCarLicenseFactory createCarLicense];
_license.city = _txtCity.text ? _txtCity.text : @"京";
_lbLicenseNumber.text = [_license printLicenseNumber];
}
@end
輸出結(jié)果依然
所以工廠模式相對簡單工廠模式的優(yōu)點顯而易見,如果業(yè)務(wù)邏輯很簡單可以選擇簡單工廠模式,如果業(yè)務(wù)邏輯復(fù)雜還是選擇工廠模式好。