• Objective-C 工厂模式(下) -- 抽象工厂模式


    相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的

    抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产

    比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买Android手机就创建一个Goolge工厂

     

    这样创建工厂, 工厂, 用户这样就是我们要考虑的因素 (其实还有手机, 这里就跳过不讲了跟简单工厂模式里面一样)

    创建工厂要有一个管理对象, 来根据客户的需求自动创建相应的工厂

    工厂只要负责生产手机就好了

     

    现在来构建代码

    先写一个基本工厂模型

    BaseFactory.h

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface BaseFactory : NSObject
     4 
     5 /**
     6  创建手机方法
     7 
     8  @return 返回手机对象
     9  */
    10 - (id)createPhone;
    11 
    12 @end

    BaseFactory.m

     1 #import "BaseFactory.h"
     2 
     3 @implementation BaseFactory
     4 
     5 - (id)createPhone {
     6     
     7     //可以再添加代码禁止BaseFactory直接调用此方法
     8     //只允许子类调用
     9     return nil;
    10 }
    11 
    12 @end

    来创建Apple工厂

    AppleFactory.h

    1 #import "BaseFactory.h"
    2 
    3 @interface AppleFactory : BaseFactory
    4 
    5 @end

    AppleFactory.m

     1 #import "AppleFactory.h"
     2 
     3 @implementation AppleFactory
     4 
     5 - (id)createPhone {
     6     
     7     NSLog(@"创建Apple手机");
     8     //这里应该是再给给工程添加手机模型, 创建并返回手机对象
     9     //现在只是举例 先不实现这部分
    10     return nil;
    11 }
    12 
    13 @end

    创建Google工厂

    GoogleFactory.h

    1 #import "BaseFactory.h"
    2 
    3 @interface GoogleFactory : BaseFactory
    4 
    5 @end

    GoogleFactory.m

     1 #import "GoogleFactory.h"
     2 
     3 @implementation GoogleFactory
     4 
     5 - (id)createPhone {
     6     
     7     NSLog(@"创建Google手机");
     8     //这里应该是再给给工程添加手机模型, 创建并返回手机对象
     9     //现在只是举例 先不实现这部分
    10     return nil;
    11 }
    12 
    13 @end

    下面是工厂管理者

    FactoryManager.h负责根据用户需求创建工厂去生产

     1 #import <Foundation/Foundation.h>
     2 #import "AppleFactory.h"
     3 #import "GoogleFactory.h"
     4 
     5 typedef enum : NSUInteger {
     6     kApple = 0x1,
     7     kGoogle,
     8 } EFactoryType;
     9 
    10 @interface FactoryManager : NSObject
    11 
    12 /**
    13  创建手机工厂
    14 
    15  @param type 工厂类别
    16  @return 返回工厂对象
    17  */
    18 + (id)createFactoryWithType:(EFactoryType)type;
    19 
    20 @end

    FactoryManager.m

     1 #import "FactoryManager.h"
     2 
     3 @implementation FactoryManager
     4 
     5 + (id)createFactoryWithType:(EFactoryType)type {
     6     
     7     BaseFactory *factory;
     8     if (type == kApple) {
     9         
    10         factory = [[AppleFactory alloc] init];
    11         
    12     } else if (type == kGoogle) {
    13         
    14         factory = [[GoogleFactory alloc] init];
    15         
    16     }
    17     
    18     return factory;
    19 }
    20 
    21 @end

    下面是实现

     1 #import "ViewController.h"
     2 #import "FactoryManager.h"
     3 
     4 @interface ViewController ()
     5 
     6 @end
     7 
     8 @implementation ViewController
     9 
    10 - (void)viewDidLoad {
    11     
    12     [super viewDidLoad];
    13     
    14     //创建工厂
    15     AppleFactory *factory = [FactoryManager createFactoryWithType:kApple];
    16     
    17     //工厂生产手机
    18     [factory createPhone];
    19     
    20 }
    21 
    22 
    23 
    24 @end

    抽象工厂模式比简单工厂模式更加灵活

  • 相关阅读:
    [vue/cli4] 目录public和asset区别
    VSCode常用指令
    [vue] JS导出Excel
    各设计模式总结与对比及Spring编程思想
    JavaIO演进之路
    用300行代码手写提炼Spring的核心原理
    设计模式(六)之装饰器模式(Decorator Pattern)深入浅出
    设计模式(五)之适配器模式(Adapter Pattern)深入浅出
    设计模式(四)之模板模式(Template Method Pattern)深入浅出
    设计模式(二)之委派模式(Delegate Pattern)深入浅出
  • 原文地址:https://www.cnblogs.com/zhouxihi/p/6049362.html
Copyright © 2020-2023  润新知