zoukankan      html  css  js  c++  java
  • Objective-C 工厂模式(上) -- 简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

    定义解释的文字很单调, 下面举例说明

    比如一个手机工厂,  它能生产iPhone, Android, Nokia三种手机.

    这家工厂的营运模式为厂家直销, 就是直接卖给用户. 用户如果要买手机就直接给工厂下订单要什么手机, 工厂就直接要找客户要的型号生产一部手机出来给客户

    这样我们就有3个因素: 工厂, 手机型号, 用户

    下面我们构建代码

    构建手机型号, 先定义一个基本手机模型 定义手机基本的功能, 打电话 发短信

    我们通过协议的方式来定义

    PhoneProtocol.h

     1 #import <Foundation/Foundation.h>
     2 
     3 @protocol PhoneProtocol <NSObject>
     4 
     5 @required
     6 
     7 /**
     8  打电话
     9  */
    10 - (void)makePhoneCall;
    11 
    12 /**
    13  发短信
    14  */
    15 - (void)sendMessage;
    16 
    17 @end

    下面开始创建手机模型

    BaseDevice.h 手机基类

    1 #import <Foundation/Foundation.h>
    2 #import "PhoneProtocol.h"
    3 
    4 @interface BaseDevice : NSObject <PhoneProtocol>
    5 
    6 @end

    BaseDevice.m

     1 #import "BaseDevice.h"
     2 
     3 @implementation BaseDevice
     4 
     5 - (void)makePhoneCall {
     6     
     7 }
     8 
     9 - (void)sendMessage {
    10     
    11 }
    12 
    13 @end

    iPhone模型

    iPhonebaseDevice.h (假如iPhone有一个特别的功能, 指纹识别)

    1 #import "BaseDevice.h"
    2 
    3 @interface iPhoneBaseDevice : BaseDevice
    4 
    5 - (void)fingerIdentifier;
    6 
    7 @end

    iPhoneBaseDevice.m

     1 #import "iPhoneBaseDevice.h"
     2 
     3 @implementation iPhoneBaseDevice
     4 
     5 - (void)makePhoneCall {
     6     
     7     NSLog(@"iPhone makePhoneCall");
     8 }
     9 
    10 - (void)sendMessage {
    11     
    12     NSLog(@"iPhone sendMessage");
    13 }
    14 
    15 - (void)fingerIdentifier {
    16     
    17     NSLog(@"iPhone fingerIdentifier");
    18 }
    19 
    20 @end

    Android手机

    AndroidBaseDevice.h (假如Android手机有个特殊功能刷系统)

    1 #import "BaseDevice.h"
    2 
    3 @interface AndroidBaseDevice : BaseDevice
    4 
    5 - (void)flashOS;
    6 
    7 @end

    AndroidBaseDevice.m

     1 #import "AndroidBaseDevice.h"
     2 
     3 @implementation AndroidBaseDevice
     4 
     5 - (void)makePhoneCall {
     6     
     7     NSLog(@"Android makePhoneCall");
     8 }
     9 
    10 - (void)sendMessage {
    11     
    12     NSLog(@"Android sendMessage");
    13 }
    14 
    15 - (void)flashOS {
    16     
    17     NSLog(@"Android flashOS");
    18 }
    19 
    20 @end

    Nokia手机

    NokiaBaseDevice.h (假如Nokia手机一个特殊功能砸核桃)

    1 #import "BaseDevice.h"
    2 
    3 @interface NokiaBaseDevice : BaseDevice
    4 
    5 - (void)knockNut;
    6 
    7 @end

    NokiaBaseDevice.m

     1 #import "NokiaBaseDevice.h"
     2 
     3 @implementation NokiaBaseDevice
     4 
     5 - (void)makePhoneCall {
     6     
     7     NSLog(@"Nokia makePhoneCall");
     8 }
     9 
    10 - (void)sendMessage {
    11     
    12     NSLog(@"Nokia sendMessage");
    13 }
    14 
    15 - (void)knockNut {
    16     
    17     NSLog(@"Nokia knockNut");
    18 }
    19 
    20 @end

    手机模型创建完了, 接着我们开始创建生产手机的工厂, 它有一个生产手机的方法

    DeviceFactory.h

     1 #import <Foundation/Foundation.h>
     2 #import "iPhoneBaseDevice.h"
     3 #import "NokiaBaseDevice.h"
     4 #import "AndroidBaseDevice.h"
     5 
     6 typedef enum : NSUInteger {
     7     kiPhone = 0x11,
     8     kAndroid,
     9     kNokia,
    10 } EPhoneDevice;
    11 
    12 @interface DeviceFactory : NSObject
    13 
    14 /**
    15  制造手机方法
    16 
    17  @param type 手机类型
    18  @return 手机实例
    19  */
    20 + (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type;
    21 
    22 @end

    DeviceFactory.m

     1 #import "DeviceFactory.h"
     2 
     3 @implementation DeviceFactory
     4 
     5 + (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type {
     6     
     7     BaseDevice *device = nil;
     8     if (type == kiPhone) {
     9         
    10         device = [[iPhoneBaseDevice alloc] init];
    11         
    12     } else if (type == kNokia) {
    13         
    14         device = [[NokiaBaseDevice alloc] init];
    15         
    16     } else if (type == kAndroid) {
    17         
    18         device = [[AndroidBaseDevice alloc] init];
    19         
    20     }
    21     
    22     return device;
    23 }
    24 
    25 @end

    好了, 现在是用户就是我们 也就是Controller可以开始定做手机了

     1 #import "ViewController.h"
     2 #import "DeviceFactory.h"
     3 
     4 @interface ViewController ()
     5 
     6 @end
     7 
     8 @implementation ViewController
     9 
    10 - (void)viewDidLoad {
    11     
    12     [super viewDidLoad];
    13     
    14     //创建一个iPhone手机实例
    15     iPhoneBaseDevice *phone = [DeviceFactory createPhoneWithDeviceType: kiPhone];
    16     
    17     //打电话
    18     [phone makePhoneCall];
    19     
    20     //发短信
    21     [phone sendMessage];
    22     
    23     //指纹识别
    24     [phone fingerIdentifier];
    25     
    26 }
    27 
    28 
    29 
    30 @end

    总结: 简单工厂方法就是定义创建对象的接口, 让子类决定实例化哪一个类. 工厂方法使得一个类的实例化延迟到其子类

    何时使用工厂方法呢?

    #1 编译时无法准确预期要创建的对象的类

    #2 类想让其子类决定在运行时创建什么

    #3 若有若干个辅助类为其子类, 而你想将返回哪个子类这一信息局部化

    使用这一模式的最低限度是, 工厂方法能给予类在变更返回哪一种对象这一点上更多的灵活性

    最后说明, 简单工厂模式可以比较清晰便捷的实现同一模型对象的创建

    但有一个弊端就是, 只能定制创建已经写好的对象, 比如上面这个工厂只能生成iPhone/Android/Nokia这三种手机,

    如果你想再定制华为手机或者小米手机, 那就要工厂去建华为和小米的手机生产线, 所以这种情况我们就要增加模型对象并修改工厂方法了

  • 相关阅读:
    HDU_oj_1003 Max Sum
    HDU_oj_1002 A+B Problem Ⅱ
    [php] 表单注意事项
    【网络基础】网速认知
    [php扩展] php安装扩展注意事项
    谷歌管理flash禁用与开启
    [php] 接口及方法和抽象类及方法的异同点
    【php】php 生僻知识点认知
    [mysql] Can't read from messagefile
    redis 散列学习要点记录
  • 原文地址:https://www.cnblogs.com/zhouxihi/p/6049198.html
Copyright © 2011-2022 走看看