美文网首页
(五)大话设计模式 - 工厂方法与抽象工厂(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