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

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

Java的实例源码:

 public class DoDoContact {

     private final int    age;
private final int safeID;
private final String name;
private final String address; public int getAge() {
return age;
} public int getSafeID() {
return safeID;
} public String getName() {
return name;
} public String getAddress() {
return address;
} public static class Builder {
private int age = 0;
private int safeID = 0;
private String name = null;
private String address = null; public Builder(String name) {
this.name = name;
} public Builder age(int val) {
age = val;
return this;
} public Builder safeID(int val) {
safeID = val;
return this;
} public Builder address(String val) {
address = val;
return this;
} public DoDoContact build() {
return new DoDoContact(this);
}
} private DoDoContact(Builder b) {
age = b.age;
safeID = b.safeID;
name = b.name;
address = b.address; }
}

java的main函数

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

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

下面使用OC来实现:

DoDoContact.h

 #import <Foundation/Foundation.h>

 @class Builder;

 @interface DoDoContact : NSObject

 @property (nonatomic,assign) NSInteger age;
@property (nonatomic,assign) NSInteger safeID;
@property (nonatomic,strong) NSString *name;
@property (nonatomic,strong) NSString *address; + (Builder*)getBulder; @end

DoDoContact.m

 #import "DoDoContact.h"

 @interface Builder ()

 @property (nonatomic,assign) NSInteger age;
@property (nonatomic,assign) NSInteger safeID;
@property (nonatomic,strong) NSString *name;
@property (nonatomic,strong) NSString *address; @end @interface DoDoContact () @end @implementation DoDoContact - (instancetype)initWith:(Builder*)builder
{
self = [super init];
if (self) {
self.age = builder.age;
self.safeID = builder.safeID;
self.name = builder.name;
self.address = builder.address;
}
return self;
} + (instancetype)getDoDoContactWith:(Builder*)builder{
DoDoContact *doDoContact = [[DoDoContact alloc] initWith:builder];
return doDoContact;
} + (Builder*)getBulder{
return [Builder new];
} @end @implementation Builder - (instancetype)init
{
self = [super init];
if (self) {
_age = ;
_safeID = ;
_name = NULL;
_address = NULL;
}
return self;
} - (Builder*)age:(NSInteger)age{
self.age = age;
return self;
} - (Builder*)safeID:(NSInteger)safeID{
self.safeID = safeID;
return self;
} - (Builder*)name:(NSString*)name{
self.name = name;
return self;
}
- (Builder*)address:(NSString*)address{
self.address = address;
return self;
} - (DoDoContact*)getDoDoContact{
return [DoDoContact getDoDoContactWith:self];
} @end

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

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

Java之Builder模式(并用OC实现了这种模式)的更多相关文章

  1. OC中的代理模式

    OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的.这里举一个简单的例子:小孩类,护士类,保姆类,其中小孩类有两个方法 ...

  2. java之设计模式工厂三兄弟之抽象工厂模式

    [学习难度:★★★★☆,使用频率:★★★★★]  工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...

  3. java之设计模式工厂三兄弟之工厂方法模式

    [学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...

  4. java之设计模式工厂三兄弟之简单工厂模式

    [学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...

  5. Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. Java多线程编程模式实战指南:Active Object模式(下)

    Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...

  7. Java多线程编程模式实战指南:Active Object模式(上)

    Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...

  8. JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯

    分布式开发的历史 利用Remote方式调用远程对象实现服务器与客户端之间通讯是一种常用的网络开发方式,在.NET与JAVA开发当中,对Remote远程对象早已有着足够的支持(对Remote远程对象调用 ...

  9. Java 工厂模式(一)— 简单工厂模式

    一.什么是工厂模式: Java中的工厂模式主要是用来将有大量共同接口的类实例化.工厂模式可以动态的决定将哪一个类实例化,不必事先知道要实例化哪个类,将类的实例化的主动权交给工厂而不是类本身.我们常见的 ...

随机推荐

  1. 从小白到区块链工程师:第一阶段:Go语言的控制台输入和输出(3)

    六,Print系列的函数输出 1:Println 打印换行.Print控制台打印,lnline 一行,打印数据后自动换一行显示.下面显示在控制台打印出不同的类型. 打印输出结果后,会自动换一行.打印结 ...

  2. linux 学习笔记 管道 pipe ls cp mv

    如ls |less -MN 含义把ls结果输出到less [ls]  ==管道== [more] ls命令 ls -a  展示隐藏的文件 <隐藏文件一般以. 开始> ls -t 以时间戳排 ...

  3. vuex那些事儿

    vuex适用于大型单页应用.每一个Vuex应用的核心就是store(仓库),store中储存大量状态,Vuex的状态存储是响应式的.vuex使用单一状态树,一个对象包含了全部的应用层级状态,每个应用仅 ...

  4. Vue渲染列表,在更新data属性后,列表未更新问题

    初始化代码如下var tableModel = new Vue({el: '#datatable',data: {items: listData}}); 当我对列表操作时,listData=>n ...

  5. spring boot + jpa + bootstrap + thymeleaf 简单的增删改查Demo

    对springboot和bootstrap初学者来说是一个不错Demo 下载地址:点击进入下载Demo 首页(http://localhost:8081) 增加 编辑 搜索

  6. JN5139 zigbee 资料

    JN5139模块是一系列可以使使用者在最短的时间内在最低的成本下实现IEEE802.15.4或ZigBee兼容系统的表贴模块.此款模块减少了用户对于RF板设计和测试框架的昂贵漫长的开发时间.这些模块利 ...

  7. BZOJ4681 : [Jsoi2010]旅行

    将边按权值从小到大排序. 考虑一条路径,一定是最大的若干条边和最小的相应的没选的边进行交换. 这会导致存在一个分界线$L$,交换之后恰好选中前$L$小的边,且只允许$>L$的边与$\leq L$ ...

  8. [P1516]青蛙的约会 (扩展欧几里得/中国剩余定理?)

    每日做智推~ 一看就是一道数学题. 再看是一道公约数的题目. 标签是中国孙子定理. 题解是扩展欧几里得 (笑) 一开始没看数据范围 只有50分 开一个longlong就可以了 #include< ...

  9. python正则表达式(三)

    表示边界 示例1:$ 需求:匹配163.com的邮箱地址 #coding=utf-8 import re # 正确的地址 ret = re.match("[\w]{4,20}@163\.co ...

  10. windows配置java运行环境

    配置jdk环境    https://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html 配置tomcat环境      https://j ...