博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java之Builder模式(并用OC实现了这种模式)
阅读量:6759 次
发布时间:2019-06-26

本文共 4135 字,大约阅读时间需要 13 分钟。

本人在学习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 
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 @end12 13 14 @interface DoDoContact ()15 16 17 @end18 19 @implementation DoDoContact20 21 - (instancetype)initWith:(Builder*)builder22 {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 @end43 44 45 46 @implementation Builder47 48 - (instancetype)init49 {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类。

 

转载地址:http://mefeo.baihongyu.com/

你可能感兴趣的文章
Fiddler的基本介绍
查看>>
Mysql On Mac OS: Remove & Install
查看>>
莫烦大大keras学习Mnist识别(4)-----RNN
查看>>
STL之string插入
查看>>
mac 安装mysql
查看>>
cout internal
查看>>
分巧克力 蓝桥杯
查看>>
项目设计阶段的一些事
查看>>
centos 7 进入图形界面
查看>>
UIWebView
查看>>
贝叶斯分类
查看>>
在java中一种中文问题的解决办法
查看>>
Linux常用命令大全
查看>>
C 函数传参问题
查看>>
luoguP1064 金明的预算方案 (有依赖的背包问题)
查看>>
MongoDB聚合
查看>>
2015年度精品 最新力作32位和64位xp,win7,win8,win10系统下载(电脑城专用版)
查看>>
I00040 计算1000以内的勾股数
查看>>
UVA11624:Fire!(BFS + 优化)
查看>>
程序员总结:帮助你早些明白一些道理
查看>>