iOS设计模式之工厂模式

一,什么是工厂模式

  • 模式定义:

    “专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。”
    世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例。
  • 需求场景:

    简单工厂的生活场景,卖水果的小贩,他给你提供苹果,橘子等水果,小贩就是一个工厂,他为你提供苹果,橘子等水果

二,适配器的结构图

  • 实现过程  

    • 创建工厂类,及定义产品类型
    • 创建工厂协议,规范接口实现
    • 创建基类,实现接口协议,便于子类继承重写
    • 创建子类,并重写协议的实现
    • 在工厂中,根据输入类型,用父类指针执行子类的实现对象,返回目标类。
    • 在目标类,输入类型,调用对象,完成具体子类对协议方法实现的调用。  
  • 结构图

三,代码示例

  • DeviceCreator(工厂类)

    • DeviceCreator.h

      #import <Foundation/Foundation.h>
      #import "DeviceProtocol.h"
      #import "iPhoneDevice.h"
      #import "AndroidDevice.h"
      #import "WindowsDevice.h"
      
      typedef enum : NSUInteger {
      
          kAndroid,
          kiPhone,
          kWindows,
      
      } DeviceType;
      
      @interface DeviceCreator : NSObject
      
      /**
       *  根据标签创建手机
       *
       *  @param deviceType 手机标签
       *
       *  @return 对应的手机
       */
      + (BaseDevice *)deviceCreatorWithDeviceType:(DeviceType)deviceType;
      
      @end
    • DeviceCreator.m  

      #import "DeviceCreator.h"
      #import "BaseDevice.h"
      
      @implementation DeviceCreator
      
      + (BaseDevice *)deviceCreatorWithDeviceType:(DeviceType)deviceType {
      
          if (deviceType == kiPhone) {
      
              return [iPhoneDevice new];
      
          } else if (deviceType == kAndroid) {
      
              return [AndroidDevice new];
      
          } else if (deviceType == kWindows) {
      
              return [WindowsDevice new];
      
          } else {
      
              return [BaseDevice new];
          }
      }
      
      @end
    • DeviceProtocol.h

      #import <Foundation/Foundation.h>
      
      @protocol DeviceProtocol <NSObject>
      
      /**
       *  打电话
       */
      - (void)phoneCall;
      
      /**
       *  系统信息
       *
       *  @return 返回系统描述信息
       */
      - (NSString *)systemInfomation;
      
      @end
  • BaseDevice(产品基类)
    • BaseDevice.h

      #import <Foundation/Foundation.h>
      #import "DeviceProtocol.h"
      
      @interface BaseDevice : NSObject <DeviceProtocol>
      
      @end
    • BaseDevice.m

      #import "BaseDevice.h"
      
      @implementation BaseDevice
      
      - (void)phoneCall {
          NSLog(@"... BaseDevice ...");
      }
      
      - (NSString *)systemInfomation {
          return @"BaseDevice";
      }
      
      @end
  • (Devices)产品类
    • iPhoneDevice

      • iPhoneDevice.h

        #import "BaseDevice.h"
        @interface iPhoneDevice : BaseDevice
        @end
      • iPhoneDevice.m

        #import "iPhoneDevice.h"
        @implementation iPhoneDevice
        - (void)phoneCall {
            NSLog(@"... iPhone ...");
        }
        
        - (NSString *)systemInfomation {
            return @"iPhone";
        }
        
        @end
    • AndroidDevice
      • AndroidDevice.h

        #import "BaseDevice.h"
        @interface AndroidDevice : BaseDevice
        @end
      • AndroidDevice.m

        #import "AndroidDevice.h"
        @implementation AndroidDevice
        - (void)phoneCall {
            NSLog(@"... Android ...");
        }
        - (NSString *)systemInfomation {
            return @"Android";
        }
        @end
    • WindowsDevice
      • WindowsDevice.h

        #import "BaseDevice.h"
        @interface WindowsDevice : BaseDevice
        @end
      • WindowsDevice.m

        #import "WindowsDevice.h"
        @implementation WindowsDevice
        - (void)phoneCall {
            NSLog(@"... Windows ...");
        }
        - (NSString *)systemInfomation {
            return @"Windows";
        }
        @end
  • ViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        BaseDevice *iPhone = [DeviceCreator deviceCreatorWithDeviceType:kiPhone];
        [iPhone phoneCall];
        NSLog(@"%@", [iPhone systemInfomation]);
    
        BaseDevice *android = [DeviceCreator deviceCreatorWithDeviceType:kAndroid];
        [android phoneCall];
        NSLog(@"%@", [android systemInfomation]);
    
        BaseDevice *windows = [DeviceCreator deviceCreatorWithDeviceType:kWindows];
        [windows phoneCall];
        NSLog(@"%@", [windows systemInfomation]);
    }
  • 打印结果:

    2019-09-07 19:52:38.880148+0800 FactoryPattern[17028:6661564] ... IOSDevice ...
    2019-09-07 19:52:38.880303+0800 FactoryPattern[17028:6661564] IOSDevice
    2019-09-07 19:52:38.880424+0800 FactoryPattern[17028:6661564] ... AndriodDevice ...
    2019-09-07 19:52:38.880518+0800 FactoryPattern[17028:6661564] AndriodDevice
    2019-09-07 19:52:38.880611+0800 FactoryPattern[17028:6661564] ... WXDevice ...
    2019-09-07 19:52:38.880690+0800 FactoryPattern[17028:6661564] WXDevice

四,优缺点

  从上面的介绍可以看出,简单工厂模式的

  • 优点
    客户端可以直接消费产品,而不必关心具体产品的实现,消除了客户端直接创建产品对象的责任,实现了对责任的分割。
    简单点说就是客户端调用简单明了,不需要关注太多的逻辑。
  • 缺点
    工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响,而且当产品类别多结构复杂的时候,把所有创建工作放进一个工厂来,会使后期程序的扩展较为困难。产品类本身是符合开闭原则的,对扩展开放对修改关闭,但是工厂类却违反了开闭原则,因为每增加一个产品,工厂类都需要进行逻辑修改和判断,导致耦合度太高。例如增加一个BananaFruit,在工厂类FruitFactory就要新增加一个枚举FruitTypeBanana。
  • 开闭原则
    一个软件实体(如类、模块、函数)应当对扩展开放,对修改关闭。
    开放-封闭原则的思想就是设计的时候,尽量让设计的类做好后就不再修改,如果有新的需求,通过新加类的方式来满足,而不去修改现有的类(代码)。

五,demo
  工厂模式

原文地址:https://www.cnblogs.com/lxlx1798/p/11482802.html

时间: 2024-10-19 00:25:34

iOS设计模式之工厂模式的相关文章

iOS 设计模式之工厂模式

工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一般是alloc一个对象,如果需要创建100个这样的对象,如果是在一个for循环中还好说,直接一句alloc就行了,但是事实并不那么如意,我们可能会在不同的地方去创建这个对象,那么我们可能需要写100句alloc 了,但是如果我们在创建对象的时候,需要在这些对象创建完之后,为它的一个属性添加一个固定的值,比方说都是某某学校的学生,那么可能有需要多些100行重复的代码了,那么,如果写一个-(void)createObj方法,把创建对象和

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

JS 设计模式(工厂模式环境搭建)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(工厂模式)--> //搭建一个工厂环境 //卖车店 function CarShop(){}; CarShop.prototype={ cons

设计模式 5 —— 工厂模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5 —— 工厂模式 设计模式 5 -- 工厂模式,布布扣,bubuko.com

php设计模式:工厂模式

意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明了工厂方法,该方法返回一个Product类型的对象. 工厂模式适用场景:1.当一个类不知道它所必须创建的对象的类的时候2.当一个类希望由它的子类来指定它所创建的对象的时候3.当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候 实例: <?php /** * 抽象工厂角色 *

浅析JAVA设计模式之工厂模式(一)

1 工厂模式简介 工厂模式的定义:简单地说,用来实例化对象,代替new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式可以动态决定将哪一个类实例化,不用先知道每次要实例化哪一个类. 工厂模式可以分一下三种形态: 简单工厂 (Simple Factory)模式:又称静态工厂模式(StaticFactory). 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory). 抽象工厂 (Abstract Factroy)模式:又称工具箱模式

浅析JAVA设计模式之工厂模式(二)

1 工厂方法模式简介 工厂方法 (Factroy Method) 模式:又称多态性工厂模式(Polymorphic Factory),在这种模式中,核心工厂不再是一个具体的类,而是一个抽象工厂,提供具体工厂实现的接口,具体创建产品交由子工厂去做,抽象工厂不涉及任何产品被实例化的细节.而不同等级的产品,就对应一个不同等级的工厂,如下图. 图1 1.1工厂方法模式(多态性工厂模式): 工厂方法模式有三个角色: 1. 抽象产品接口 2. 具体产品类 3. 抽象工厂接口 4.具体工厂类. 1.2工厂方法

设计模式之工厂模式 (二)

工厂模式分为三大类 简单工厂(SimpleFactory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 动态工厂(Dynamic Factory,属于优化版简单工厂) 一.简单工厂 组成如下: (1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑.在java中它往往由一个具体类实现. (2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口.在java中由接口或者抽象类来实现. (3) 具体产品角色:工厂类所创建的对象就是此

浅谈php设计模式(1)---工厂模式

一.接口继承直接调用 先看看这样一段代码: 1 <?php 2 3 interface db{ 4 function conn(); 5 } 6 7 class dbmysql implements db { 8 public function conn(){ 9 echo "连接到了mysql"; 10 } 11 } 12 13 class dbsqlite implements db{ 14 public function conn(){ 15 echo "连接到了