之前有写过一个简单工厂的的demo,接下来来一起实现一下它的升级版:工厂方法和抽象工厂
代码实现 - 工厂方法
我们以宝马汽车工厂生产宝马汽车为例子,一个BMWFactory 和BMWCar
ICar 汽车协议接口
相当于汽车产品规范,所有汽车必须能行驶,该有的属性配置得有 不能胡乱造汽车
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
//汽车协议接口类
@protocol ICar <NSObject>
@required
-(void)run:(int)speed;
@end
NS_ASSUME_NONNULL_END
宝马车
遵循汽车产品规范(实现ICar协议)
#import <Foundation/Foundation.h>
#import "ICar.h"
NS_ASSUME_NONNULL_BEGIN
@interface BMWCar : NSObject<ICar>
-(void)run:(int)speed;
@end
NS_ASSUME_NONNULL_END
#import "BMWCar.h"
@implementation BMWCar
-(void)run:(int)speed {
NSLog(@"BMW时速%d",speed);
}
@end
汽车工厂协议接口
相当于营业执照 有该营业执照的工厂可以生产汽车
#import <Foundation/Foundation.h>
#import "ICar.h"
#import "IAutoParts.h"
NS_ASSUME_NONNULL_BEGIN
//汽车工厂 可以生产各种汽车
@protocol ICarFactory <NSObject>
//生产汽车
@required
-(id<ICar>)produceCar;
//生产汽车零部件
@required
-(id<IAutoParts>)produceAutoParts;
@end
NS_ASSUME_NONNULL_END
宝马汽车工厂
宝马汽车工厂要生产宝马汽车则必须拥有汽车生产营业执照(实现ICarFactory协议)
只生产宝马车 其他车品牌不生产(只创建BMWCar一种品牌的汽车)
#import <Foundation/Foundation.h>
#import "ICarFactory.h"
NS_ASSUME_NONNULL_BEGIN
@interface BMWFactory : NSObject<ICarFactory>
-(id<ICar>)produceCar;
@end
NS_ASSUME_NONNULL_END
#import "BMWFactory.h"
#import "BMWCar.h"
#import "BWMAutoParts.h"
@implementation BMWFactory
-(id<ICar>)produceCar {
return [[BMWCar alloc] init];//只生产宝马汽车
}
-(id<IAutoParts>)produceAutoParts {
return [[BWMAutoParts alloc] init];
}
@end
工厂方法实现
指定宝马汽车工厂 生产宝马汽车
id<ICarFactory> carFactory = nil;//申明一个汽车工厂
carFactory = [[BMWFactory alloc] init];//指定宝马工厂来生产
id<ICar> car = [carFactory produceCar];//宝马汽车工厂只生产宝马汽车
[car run:100];//汽车已生产 可以开跑啦
扩展:现在要想造奔驰车
同样的原理,要造奔驰车 就建一个奔驰汽车工厂,专门用来生产奔驰车(单一原则)
奔驰汽车
#import <Foundation/Foundation.h>
#import "ICar.h"
NS_ASSUME_NONNULL_BEGIN
@interface BensCar : NSObject<ICar>
-(void)run:(int)speed;
@end
NS_ASSUME_NONNULL_END
#import "BensCar.h"
@implementation BensCar
-(void)run:(int)speed {
NSLog(@"Bens时速%d",speed);
}
@end
奔驰汽车工厂
#import <Foundation/Foundation.h>
#import "ICarFactory.h"
NS_ASSUME_NONNULL_BEGIN
@interface BMWFactory : NSObject<ICarFactory>
-(id<ICar>)produceCar;
@end
NS_ASSUME_NONNULL_END
#import "BMWFactory.h"
#import "BMWCar.h"
#import "BWMAutoParts.h"
@implementation BMWFactory
-(id<ICar>)produceCar {
return [[BMWCar alloc] init];
}
-(id<IAutoParts>)produceAutoParts {
return [[BWMAutoParts alloc] init];
}
@end
要生产奔驰车
我们只要在原有的基础上指定奔驰工厂就可以造奔驰车了 而不用修改其他的逻辑
carFactory = [[BensFactory alloc] init];
id<ICarFactory> carFactory = nil;
carFactory = [[BensFactory alloc] init];
id<ICar> car = [carFactory produceCar];
[car run:100];
抽象工厂实现
定义与区别
区别:① 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
② 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
扩展:每种品牌的要生产对应的汽车配件怎么办?
一个工厂不单单可以造汽车,同样也是可以造该品牌的配件
所以,我们可以修改汽车工厂协议(ICarFactory)允许生产汽车配件(IAutoParts)
看到之前的ICarFactory有定义produceAutoParts,则BMWFactory,BensFactory有这个权限生产了
//生产汽车零部件
@required
-(id<IAutoParts>)produceAutoParts;
抽象工厂
//抽象工厂
id<ICarFactory> carFactory = nil;//申明一个汽车工厂
carFactory = [[BMWFactory alloc] init];//指定宝马工厂来生产
id<ICar>car = [carFactory produceCar];//让该工厂生产汽车(不同的工厂生产不会的车)
[car run:100];//汽车已生产 可以开跑啦
id<IAutoParts>parts = [carFactory produceAutoParts];//让该工厂生产配件
[parts install];//生产的配件可以安装啦
只要更换carFactory工厂 就可以达到生产奔驰汽车和奔驰配件的目的 其他都不用修改
carFactory = [[BensFactory alloc] init];//指定宝马工厂来生产
Java的DataSouce就是抽象工厂的一个例子,数据库连接可以使用常用的JDBC,Drui等方式,只要更换DataSouce就可以灵活更换
网友评论