美文网首页
(五)大话设计模式 - 工厂方法与抽象工厂(IOS版)

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

作者: 林鹏_dev | 来源:发表于2019-03-20 11:21 被阅读0次

之前有写过一个简单工厂的的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就可以灵活更换

相关文章

网友评论

      本文标题:(五)大话设计模式 - 工厂方法与抽象工厂(IOS版)

      本文链接:https://www.haomeiwen.com/subject/cwegmqtx.html