• Java之Builder模式(并用OC实现了这种模式)


    本人在学习Java,直接先学习Netty框架,因为Netty框架是业界最流行的NIO框架之一,在学习的过程中,了解到Netty服务端启动需要先创建服务器启动辅助类ServerBootstrap,它提供了一系列的方法用于设置服务器端启动相关的参数。然而在创建ServerBootstrap实例时,发现ServerBootstrap只有一个无参的构造函数,事实上它需要与多个其它组件或者类交互。ServerBootstrap构造函数没有参数的原因是因为它的参数太多了,而且未来也可能会发生变化。Netty创造者为了解决这个问题,就引入了Builder模式。

    学习到这里,在IOS开发中,我虽然也研习过23中常用的设计模式,但是我却从没听过的Builder模式,于是就开始了探索Builder模式,并尝试用OC语言去模仿实现这种模式。说不定以后在iOS开发中会用到呢。

    Java的实例源码:

     1 public class DoDoContact {
     2 
     3     private final int    age;
     4     private final int    safeID;
     5     private final String name;
     6     private final String address;
     7  
     8     public int getAge() {
     9         return age;
    10     }
    11  
    12     public int getSafeID() {
    13         return safeID;
    14     }
    15  
    16     public String getName() {
    17         return name;
    18     }
    19  
    20     public String getAddress() {
    21         return address;
    22     }
    23  
    24     public static class Builder {
    25         private int    age     = 0;
    26         private int    safeID  = 0;
    27         private String name    = null;
    28         private String address = null;
    29         
    30         public Builder(String name) {
    31             this.name = name;
    32         }
    33  
    34         public Builder age(int val) {
    35             age = val;
    36             return this;
    37         }
    38  
    39         public Builder safeID(int val) {
    40             safeID = val;
    41             return this;
    42         }
    43  
    44         public Builder address(String val) {
    45             address = val;
    46             return this;
    47         }
    48  
    49         public DoDoContact build() {
    50             return new DoDoContact(this);
    51         }
    52     }
    53  
    54     private DoDoContact(Builder b) {
    55         age = b.age;
    56         safeID = b.safeID;
    57         name = b.name;
    58         address = b.address;
    59  
    60     }
    61 }

    java的main函数

    1 public class Test2{
    2     public static void main(String[] args) {
    3         DoDoContact ddc = new DoDoContact.Builder("Ace").age(10)
    4                 .address("beijing").build();
    5         System.out.println("name=" + ddc.getName() + "age =" + ddc.getAge()
    6                 + "address" + ddc.getAddress());
    7     }
    8 }

    有木有发现在main函数中,创建一个对象,却可以动态的传入参数。

    下面使用OC来实现:

    DoDoContact.h

     1 #import <Foundation/Foundation.h>
     2 
     3 @class Builder;
     4 
     5 @interface DoDoContact : NSObject
     6 
     7 @property (nonatomic,assign) NSInteger age;
     8 @property (nonatomic,assign) NSInteger safeID;
     9 @property (nonatomic,strong) NSString *name;
    10 @property (nonatomic,strong) NSString *address;
    11 
    12 + (Builder*)getBulder;
    13 
    14 @end

    DoDoContact.m

     1 #import "DoDoContact.h"
     2 
     3 
     4 @interface Builder ()
     5 
     6 @property (nonatomic,assign) NSInteger age;
     7 @property (nonatomic,assign) NSInteger safeID;
     8 @property (nonatomic,strong) NSString *name;
     9 @property (nonatomic,strong) NSString *address;
    10 
    11 @end
    12 
    13 
    14 @interface DoDoContact ()
    15 
    16 
    17 @end
    18 
    19 @implementation DoDoContact
    20 
    21 - (instancetype)initWith:(Builder*)builder
    22 {
    23     self = [super init];
    24     if (self) {
    25         self.age = builder.age;
    26         self.safeID = builder.safeID;
    27         self.name = builder.name;
    28         self.address = builder.address;
    29     }
    30     return self;
    31 }
    32 
    33 + (instancetype)getDoDoContactWith:(Builder*)builder{
    34     DoDoContact *doDoContact = [[DoDoContact alloc] initWith:builder];
    35     return doDoContact;
    36 }
    37 
    38 + (Builder*)getBulder{
    39     return [Builder new];
    40 }
    41 
    42 @end
    43 
    44 
    45 
    46 @implementation Builder
    47 
    48 - (instancetype)init
    49 {
    50     self = [super init];
    51     if (self) {
    52         _age = 0;
    53         _safeID = 0;
    54         _name = NULL;
    55         _address = NULL;
    56     }
    57     return self;
    58 }
    59 
    60 - (Builder*)age:(NSInteger)age{
    61     self.age = age;
    62     return self;
    63 }
    64 
    65 - (Builder*)safeID:(NSInteger)safeID{
    66     self.safeID = safeID;
    67     return self;
    68 }
    69 
    70 - (Builder*)name:(NSString*)name{
    71     self.name = name;
    72     return self;
    73 }
    74 - (Builder*)address:(NSString*)address{
    75     self.address = address;
    76     return self;
    77 }
    78 
    79 - (DoDoContact*)getDoDoContact{
    80     return [DoDoContact getDoDoContactWith:self];
    81 }
    82 
    83 
    84 @end

    再来看创建DoDoContact对象的方式,本人这里无意中用的是IOS工程所以直接在ViewController类中创建了。

    虽然也是可以动态传入参数,但是OC的语言风格却不好看。但是用Swift可以,毕竟Swift也模仿了java的class类。

  • 相关阅读:
    sqlHelp.java
    IIS7.0 检测到在集成的托管管道模式下不适用的ASP.NET设置 的解决方法
    [转]安装程序在安装此软件包时遇到一个错误,这可能表示此软件包有错。错误码是29506
    单表中的sql语句
    网页::::无法访问请求的页面,因为该页的相关配置数据无效。
    <authentication mode="Windows"/>
    无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。这个错误很难判断错在哪里,刚开……
    [转] css实现透明度(兼容IE6、IE7、Firefox2.0)
    企业微信机器人消息发送
    阴阳历自动转换工具函数
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/6417794.html
Copyright © 2020-2023  润新知