工厂模式
概括
工厂模式分为类工厂方法,简单工厂,工厂,抽象工厂。
类工厂方法
类工厂方法我们常用,优点是可以快速创建对象。
简单工厂模式
-
什么是简单工厂模式好处是什么
有一个抽象产品,该产品有个行为。没有实现这个行为。有两个具体产品继承于该抽象产品,并且实现这个行为。有个工厂根据传入的枚举负责生产该抽象产品(实际上是具体产品。这里是多态)。
该模式的好处是开闭,即对内扩展是开放的,对外修改是关闭的。 -
模式图
-
实现代码
/** 产品 **/
//Map
@interface Map : NSObject
- (void)showCitys;
@end
@implementation Map
- (void)showCitys{
}
@end
//BaiduMap
@interface BaiduMap : Map
@end
@implementation BaiduMap
- (void)showCitys{
NSLog(@"百度地图显示城市");
}
@end
//GoogleMap
@interface GoogleMap : Map
@end
@implementation GoogleMap
- (void)showCitys{
NSLog(@"谷歌地图显示城市");
}
/** 工厂 **/
//FactoryMap
typedef NS_ENUM(NSUInteger, MapType) {
BaiduMapType,
GoogleMapType,
};
@interface FactoryMap : NSObject
+ (Map *)creatMap:(MapType)type;
@end
@implementation FactoryMap
+ (Map *)creatMap:(MapType)type{
Map *map = nil;
if (type == BaiduMapType) {
map = [[BaiduMap alloc] init];
} else {
map = [[GoogleMap alloc] init];
}
return map;
}
@end
/** 调用 **/
- (void)viewDidLoad {
[super viewDidLoad];
Map *baiduMap = [FactoryMap creatMap:BaiduMapType];
[baiduMap showCitys];
Map *googleMap = [FactoryMap creatMap:GoogleMapType];
[googleMap showCitys];
}
工厂模式
-
什么是工厂模式,工厂模式的好处是什么
有一个抽象产品,该产品有个行为。没有实现这个行为。有两个具体产品继承于该抽象产品,并且实现这个行为。有个抽象工厂负责生产该抽象产品,定义了创建该抽象产品的接口与实现。有两个工厂分别继承于该抽象工厂,并分别重写创建产品的方法,分别创建自己的具体产品。
该模式的好处是开闭,即对内扩展是开放的,对外修改是关闭的。 -
模式图
3. 实现代码
/** 产品 **/
//Map
@interface Map : NSObject
- (void)showCitys;
@end
@implementation Map
- (void)showCitys{
}
@end
//BaiduMap
@interface BaiduMap : Map
@end
@implementation BaiduMap
- (void)showCitys{
NSLog(@"百度地图显示城市");
}
@end
//GoogleMap
@interface GoogleMap : Map
@end
@implementation GoogleMap
- (void)showCitys{
NSLog(@"谷歌地图显示城市");
}
/** 工厂 **/
//MapFactory
@interface MapFactory : NSObject
+ (Map *)createMap;
@end
@implementation MapFactory
+ (Map *)createMap{
return [[Map alloc] init];
}
@end
//BaiduMapFactory
@interface BaiduMapFactory : MapFactory
@end
@implementation BaiduMapFactory
+ (Map *)createMap{
return [[BaiduMap alloc] init];
}
@end
//GoogleFactory
@interface GoogleFactory : MapFactory
@end
@implementation GoogleFactory
+ (Map *)createMap{
return [[GoogleMap alloc] init];
}
@end
/** 调用 **/
- (void)viewDidLoad {
[super viewDidLoad];
Map *baiduMap = [BaiduMapFactory createMap];
[baiduMap showCitys];
Map *googleMap = [GoogleMapFactory createMap];
[googleMap showCitys];
}
抽象工厂
-
什么是抽象工厂,有什么优点
有两个抽象产品,两个抽象产品都分别有个行为。没有实现这个行为。有四个具体产品分别成对继承两个抽象产品,并且实现了对应父类的行为。有个抽象工厂负责生产这两个抽象产品,定义了创建该抽象产品的接口与实现。有两个工厂分别继承于该抽象工厂,并分别重写父类中两个创建产品的方法,分别创建自己的具体产品。 该模式的好处是开闭,即对内扩展是开放的,对外修改是关闭的。 -
模式图
3. 实现代码
/** 产品 **/
//Map
@interface Map : NSObject
- (void)showCitys;
@end
@implementation Map
- (void)showCitys{
}
@end
//BaiduMap
@interface BaiduMap : Map
@end
@implementation BaiduMap
- (void)showCitys{
NSLog(@"百度地图显示城市");
}
@end
//GoogleMap
@interface GoogleMap : Map
@end
@implementation GoogleMap
- (void)showCitys{
NSLog(@"谷歌地图显示城市");
}
//Browser
@interface Browser : NSObject
- (void)openPage;
@end
@implementation Browser
- (void)openPage{
}
@end
//BaiduBrowser
@interface BaiduBrowser : Browser
@end
@implementation BaiduBrowser
- (void)openPage{
NSLog(@"百度浏览器打开网页");
}
@end
//GoogleBrowser
@interface GoogleBrowser : Browser
@end
@implementation GoogleBrowser
- (void)openPage{
NSLog(@"谷歌浏览器打开网页");
}
@end
/** 工厂 **/
//Factory
@interface Factory : NSObject
+ (Map *)createMap;
+ (Browser *)createBrowser;
@end
@implementation Factory
+ (Map *)createMap{
return [[Map alloc] init];
}
+ (Browser *)createBrowser{
return [[Browser alloc] init];
}
@end
//BaiduFactory
@interface BaiduFactory : Factory
@end
@implementation BaiduFactory
+ (Browser *)createBrowser{
return [[BaiduBrowser alloc] init];
}
+ (Map *)createMap{
return [[BaiduMap alloc] init];
}
@end
//GoogleFactory
@interface GoogleFactory : Factory
@end
@implementation GoogleFactory
+ (Browser *)createBrowser{
return [[GoogleBrowser alloc] init];
}
+ (Map *)createMap{
return [[GoogleMap alloc] init];
}
@end
/** 调用 **/
- (void)viewDidLoad {
[super viewDidLoad];
Map *googleMap = [GoogleFactory createMap];
[googleMap showCitys];
Browser *googleBrowser = [GoogleFactory createBrowser];
[googleBrowser openPage];
Map *baiduMap = [BaiduFactory createMap];
[baiduMap showCitys];
Browser *baiduBrowser = [BaiduFactory createBrowser];
[baiduBrowser openPage];
}