(五)大话设计模式 - 工厂方法与抽象工厂(IOS版)

之前有写过一个简单工厂的的demo,接下来来一起实现一下它的升级版:工厂方法和抽象工厂

代码实现 - 工厂方法

我们以宝马汽车工厂生产宝马汽车为例子,一个BMWFactory 和BMWCar

ICar 汽车协议接口
相当于汽车产品规范,所有汽车必须能行驶,该有的属性配置得有 不能胡乱造汽车

#import 

NS_ASSUME_NONNULL_BEGIN

//汽车协议接口类
@protocol ICar 

@required
-(void)run:(int)speed;

@end

NS_ASSUME_NONNULL_END

宝马车
遵循汽车产品规范(实现ICar协议)

#import 
#import "ICar.h"
NS_ASSUME_NONNULL_BEGIN

@interface BMWCar : NSObject

-(void)run:(int)speed;

@end

NS_ASSUME_NONNULL_END
#import "BMWCar.h"

@implementation BMWCar

-(void)run:(int)speed {
    NSLog(@"BMW时速%d",speed);
}
@end

汽车工厂协议接口
相当于营业执照 有该营业执照的工厂可以生产汽车

#import 
#import "ICar.h"
#import "IAutoParts.h"
NS_ASSUME_NONNULL_BEGIN

//汽车工厂 可以生产各种汽车
@protocol ICarFactory 

//生产汽车
@required
-(id)produceCar;

//生产汽车零部件
@required
-(id)produceAutoParts;

@end

NS_ASSUME_NONNULL_END

宝马汽车工厂
宝马汽车工厂要生产宝马汽车则必须拥有汽车生产营业执照(实现ICarFactory协议)
只生产宝马车 其他车品牌不生产(只创建BMWCar一种品牌的汽车)

#import 
#import "ICarFactory.h"
NS_ASSUME_NONNULL_BEGIN

@interface BMWFactory : NSObject

-(id)produceCar;

@end

NS_ASSUME_NONNULL_END
#import "BMWFactory.h"
#import "BMWCar.h"
#import "BWMAutoParts.h"
@implementation BMWFactory

-(id)produceCar {
    return [[BMWCar alloc] init];//只生产宝马汽车
}

-(id)produceAutoParts {
     return [[BWMAutoParts alloc] init];
}

@end

工厂方法实现

指定宝马汽车工厂 生产宝马汽车

    id carFactory = nil;//申明一个汽车工厂
    carFactory = [[BMWFactory alloc] init];//指定宝马工厂来生产
    id car = [carFactory produceCar];//宝马汽车工厂只生产宝马汽车
    [car run:100];//汽车已生产 可以开跑啦

扩展:现在要想造奔驰车
同样的原理,要造奔驰车 就建一个奔驰汽车工厂,专门用来生产奔驰车(单一原则)
奔驰汽车

#import 
#import "ICar.h"
NS_ASSUME_NONNULL_BEGIN

@interface BensCar : NSObject

-(void)run:(int)speed;

@end

NS_ASSUME_NONNULL_END
#import "BensCar.h"

@implementation BensCar

-(void)run:(int)speed {
    NSLog(@"Bens时速%d",speed);
}

@end

奔驰汽车工厂

#import 
#import "ICarFactory.h"
NS_ASSUME_NONNULL_BEGIN

@interface BMWFactory : NSObject

-(id)produceCar;

@end

NS_ASSUME_NONNULL_END
#import "BMWFactory.h"
#import "BMWCar.h"
#import "BWMAutoParts.h"
@implementation BMWFactory

-(id)produceCar {
    return [[BMWCar alloc] init];
}

-(id)produceAutoParts {
     return [[BWMAutoParts alloc] init];
}

@end

要生产奔驰车
我们只要在原有的基础上指定奔驰工厂就可以造奔驰车了 而不用修改其他的逻辑
carFactory = [[BensFactory alloc] init];

    id carFactory = nil;
    carFactory = [[BensFactory alloc] init];
    id car = [carFactory produceCar];
    [car run:100];

抽象工厂实现

定义与区别
区别:① 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
   ② 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

扩展:每种品牌的要生产对应的汽车配件怎么办?
一个工厂不单单可以造汽车,同样也是可以造该品牌的配件
所以,我们可以修改汽车工厂协议(ICarFactory)允许生产汽车配件(IAutoParts)
看到之前的ICarFactory有定义produceAutoParts,则BMWFactory,BensFactory有这个权限生产了

//生产汽车零部件
@required
-(id)produceAutoParts;

抽象工厂

   //抽象工厂
    id carFactory = nil;//申明一个汽车工厂
    carFactory = [[BMWFactory alloc] init];//指定宝马工厂来生产
    idcar = [carFactory produceCar];//让该工厂生产汽车(不同的工厂生产不会的车)
    [car run:100];//汽车已生产 可以开跑啦
    idparts = [carFactory produceAutoParts];//让该工厂生产配件
    [parts install];//生产的配件可以安装啦

只要更换carFactory工厂 就可以达到生产奔驰汽车和奔驰配件的目的 其他都不用修改
carFactory = [[BensFactory alloc] init];//指定宝马工厂来生产

Java的DataSouce就是抽象工厂的一个例子,数据库连接可以使用常用的JDBC,Drui等方式,只要更换DataSouce就可以灵活更换

你可能感兴趣的:((五)大话设计模式 - 工厂方法与抽象工厂(IOS版))