zoukankan      html  css  js  c++  java
  • IOS设计模式-简单工厂

    为什么 “简单工厂原理” 叫简单工厂,因为这个工厂类不是抽象类,而是实体类,工厂本身就是一个具体的对象。



    写一个例子演示简单工厂模式:

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    协议的用法,小何子总结:
    一个类如果实现了某个协议,这个协议中的方法就可以直接在这个类的@implementation中实现
    注意:协议中的方法不需要在这个类@interface中声明出来

    接着,继承实现协议的类的子类,协议中得方法同样不需要在@interface中声明,
            但需要哪个协议里的方法的话就在@implementation中实现。
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


    手机协议,提供了所有手机的共同的功能。
    记住:使用协议的目的,是为了能统一使用的接口,也是为了客户端使用是要遵循某项协议的。
    PhoneProtocol.h:

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

    =====================================================
    基本的手机设备,抽象类,具备手机的基本的功能,
        接收一个协议并继承必须要的功能:打电话和发短信
    BaseDevie.h:

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

    BaseDevie.m:

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

    =====================================================
    DeviceFactory.h:

     1 #import <Foundation/Foundation.h>
     2 #import "BaseDevie.h"
     3 #import "iPhoneDevice.h"
     4 #import "AndroidDevice.h"
     5 #import "NokiaDevice.h"
     6 
     7 typedef enum : NSUInteger {
     8     
     9     kiPhone   = 0x11,
    10     kAndroid,
    11     kNokia,
    12     
    13 } EDevieType;
    14 简单工厂模式的工厂类,是根据客户端的某条指令来生产具体某个设备,这里就通过枚举列举出用户的具体相关的指令。
    15 总结:工厂模式经常可以和枚举搭配,因为工厂模式生成基本行为相同拓展行为不同的同一类对象
    16 这些不同但基础本质相容的对象,可以用枚举列举。
    17 例如:这里就用枚举列举了:iPhone、Android、Nokia三种手机。
    18 枚举的名字EDevieType的开头是个习惯用法用E。
    19 @interface DeviceFactory : NSObject
    20 
    21 //首先,这个工厂类会返回一个对象,什么样的对象呢?这个对象本身就是实现了接口PhoneProtocol的对象
    22 /**
    23  *  根据用户提交的指令创建出具体的手机
    24  *
    25  *  @param type 创建的指令
    26  *
    27  *  @return 创建出的手机
    28  */
    29 + (BaseDevie <PhoneProtocol> *)deviceFactoryWithDevieType:(EDevieType)type;
    30 
    31 @end

    DeviceFactory.m:

     1 #import "DeviceFactory.h"
     2 
     3 @implementation DeviceFactory
     4 
     5 + (BaseDevie <PhoneProtocol> *)deviceFactoryWithDevieType:(EDevieType)type {
     6 
     7     BaseDevie <PhoneProtocol> *device = nil;//使用实现协议的类,声明指针对象的时候记得带上<协议>
     8     
     9     if (type == kiPhone) {
    10         
    11         device = [[iPhoneDevice alloc] init];
    12         
    13     }  else if (type == kAndroid) {
    14     
    15         device = [[AndroidDevice alloc] init];
    16         
    17     }  else if (type == kNokia) {
    18         
    19         device = [[NokiaDevice alloc] init];
    20         
    21     }
    22     
    23     return device;
    24 }
    25 
    26 @end

    =====================================================
    iPhoneDevice.h:

     1 #import "BaseDevie.h"
     2 
     3 @interface iPhoneDevice : BaseDevie
     4 
     5 /**
     6  *  指纹识别
     7  *  多的一个功能,也是iPhone自己独有的功能。也是区别同类产品的关键。
     8  *  特有的功能就可以在自己的@interface中实现。
     9  */
    10 - (void)fingerprintIndetification;
    11 
    12 @end

    iPhoneDevice.m:

     1 #import "iPhoneDevice.h"
     2 
     3 @implementation iPhoneDevice
     4 因为继承自实现了协议的BaseDevie,所以这里只需要在implementation实现协议里的方法就可以了。
     5 - (void)phoneCall {
     6  
     7     NSLog(@"iPhone phoneCall");
     8 }
     9 
    10 - (void)sendMessage {
    11     
    12     NSLog(@"iPhone sendMessage");
    13 }
    14 
    15 - (void)fingerprintIndetification {
    16 
    17     NSLog(@"iPhone fingerprintIndetification");
    18 }
    19 
    20 @end

    =====================================================
    AndroidDevice.h:

     1 #import "BaseDevie.h"
     2 
     3 @interface AndroidDevice : BaseDevie
     4 
     5 /**
     6  *  定制主题
     7  */
     8 - (void)customTheme;
     9 
    10 @end

    AndroidDevice.m:

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

    =====================================================
    NokiaDevice.h:

     1 #import "BaseDevie.h"
     2 
     3 @interface NokiaDevice : BaseDevie
     4 
     5 /**
     6  *  敲核桃
     7  */
     8 - (void)knockWalnut;
     9 
    10 @end

    NokiaDevice.m:

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

    ==============================================================

    客户端只有ViewController.m中:

     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     // 工厂中创建出具体产品
    15     iPhoneDevice *iPhone = (iPhoneDevice *)[DeviceFactory deviceFactoryWithDevieType:kiPhone];
    16     
    17     // 使用产品的特有的功能
    18     [iPhone fingerprintIndetification];
    19     
    20     //如果工厂中创建出具体产品,是这样的:
    21     //BaseDevie *iPhone = [DeviceFactory deviceFactoryWithDevieType:kiPhone];
    22     //这样的话,手机就不能使用自己特有的功能,也就是不能使用自己类的@interface中声明的方法
    23 }
    24 
    25 @end


    简单工厂:工厂类通过客户端发送一个指令产生具体的产品,而这些产品彼此之间都有共同的特性,共同的特性由协议规定了,但是具体的产品对象有自己特有的功能,就需要具体的声明和实现。这就是简单工厂。

    那么简单工厂的使用场景
    1. 简化生产流程
        客户只关心最终产品,所以可以把具体生产流程封装起来,通过简单工厂创建最终产品。所以起到了简化生产流程。
    2. 隔离生产产品的细节
        前面一点提到了。
    3. 不同类型的产品之间有着一些共同的功能
        共同的功能可以通过协议来设定和规划。
    4. 一个具体的工厂
        是直接实现的工厂,而不是某个通过继承或者抽象的方法来实现生产的需求。


    源码下载链接:http://pan.baidu.com/s/1bnynlQf 密码:ss43

     
  • 相关阅读:
    git 命令
    Spring Boot Web应用开发 CORS 跨域请求支持
    layui demo
    jQuery jqGrid 4.7
    jQurey zTree Demo 3.5
    jQurey zTree API 3.5
    jQurey Select2 4.0
    jQurey Validation 1.16
    Laytpl 1.2
    My97DatePicker 4.8
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/4916159.html
Copyright © 2011-2022 走看看