工厂模式就是我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式又分为简单工厂模式,工厂方法模式,抽象工厂模式。
下面的三张图,完美的解释了什么是工厂模式。
简单工厂模式
工厂方法模式
抽象工厂模式
工厂模式优点
一个调用者想创建一个对象,只要知道其名称就可以了。
扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
屏蔽产品的具体实现,调用者只关心产品的接口。
工厂模式缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
其实如果懂了抽象工厂模式,上面的两种模式也就都懂了。所以看下面这个例子。
现在我们要创建两个工厂,一个是苹果厂,一个是谷歌厂,同时苹果厂可以生产苹果手机和苹果手表,谷歌厂可以生产安卓手机和安卓手表,同时每部手机不光可以打电话,发短信,还都有自己独特的功能,苹果手机可以指纹识别,安卓可以主题定制。
需要先创建工厂基类。
@implementation BaseFactory
- (BasePhone *)createPhone {
return nil;
}
- (BaseWatch *)createWatch {
return nil;
}
@end
然后根据基类分别创建苹果厂和谷歌厂。
@implementation AppleFactory
- (BasePhone *)createPhone {
return [[IPhone alloc] init];
}
- (BaseWatch *)createWatch {
return [[IWatch alloc] init];
}
@end
@implementation GoogleFactory
- (BasePhone *)createPhone {
return [[Android alloc] init];
}
- (BaseWatch *)createWatch {
return [[AndroidWatch alloc] init];
}
@end
然后创建手机基类。
@interface BasePhone : NSObject <PhoneProtocol>
@end
@implementation BasePhone
- (void)phoneCall {
}
- (void)sendMessage {
}
@end
根据手机基类创建不同的手机。
@implementation IPhone
- (void)phoneCall {
NSLog(@"iPhone phoneCall");
}
- (void)sendMessage {
NSLog(@"iPhone sendMessage");
}
- (void)fingerprintIndetification {
NSLog(@"iPhone fingerprintIndetification");
}
@end
@implementation Android
- (void)phoneCall {
NSLog(@"Android phoneCall");
}
- (void)sendMessage {
NSLog(@"Android sendMessage");
}
- (void)customTheme {
NSLog(@"Android customTheme");
}
@end
创建不同工厂的工厂管理类。
typedef NS_ENUM(NSUInteger, KFactoryType) {
KApple,
KGoogle
};
@interface FactoryManager : NSObject
/**
获取工厂
@param factoryType 工厂类型
@return 创建出的工厂
*/
+ (BaseFactory *)factoryWithBrand:(KFactoryType)factoryType;
@end
+ (BaseFactory *)factoryWithBrand:(KFactoryType)factoryType {
BaseFactory *factory = nil;
if (factoryType == KApple) {
factory = [[AppleFactory alloc] init];
} else if (factoryType == KGoogle) {
factory = [[GoogleFactory alloc] init];
}
return factory;
}
@end
那么下面就是来使用了,屏蔽内部实现,通过不同工厂类组装成的抽象工厂模式
// 获取工厂
BaseFactory *googleFactory = [FactoryManager factoryWithBrand:KGoogle];
// 创建商品
Android *androidPhone = (Android *)[googleFactory createPhone];
BaseWatch *androidWatch = [googleFactory createWatch];
[androidPhone phoneCall];
//定制主题
[androidPhone customTheme];
// 获取工厂
BaseFactory *appleFactory = [FactoryManager factoryWithBrand:KApple];
// 创建商品
IPhone *applePhone = (IPhone *)[appleFactory createPhone];
BaseWatch *appleWatch = [appleFactory createWatch];
[applePhone phoneCall];
//指纹识别
[applePhone fingerprintIndetification];