Java之Builder模式(并用OC实现了这种模式)
本人在学习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实现了这种模式)的更多相关文章
- OC中的代理模式
OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的.这里举一个简单的例子:小孩类,护士类,保姆类,其中小孩类有两个方法 ...
- java之设计模式工厂三兄弟之抽象工厂模式
[学习难度:★★★★☆,使用频率:★★★★★] 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...
- java之设计模式工厂三兄弟之工厂方法模式
[学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...
- java之设计模式工厂三兄弟之简单工厂模式
[学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...
- Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java多线程编程模式实战指南:Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- Java多线程编程模式实战指南:Active Object模式(上)
Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...
- JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯
分布式开发的历史 利用Remote方式调用远程对象实现服务器与客户端之间通讯是一种常用的网络开发方式,在.NET与JAVA开发当中,对Remote远程对象早已有着足够的支持(对Remote远程对象调用 ...
- Java 工厂模式(一)— 简单工厂模式
一.什么是工厂模式: Java中的工厂模式主要是用来将有大量共同接口的类实例化.工厂模式可以动态的决定将哪一个类实例化,不必事先知道要实例化哪个类,将类的实例化的主动权交给工厂而不是类本身.我们常见的 ...
随机推荐
- POJ 3061 Subsequence【二分答案】||【尺取法】
<题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...
- POJ 1330 Nearest Common Ancestors (模板题)【LCA】
<题目链接> 题目大意: 给出一棵树,问任意两个点的最近公共祖先的编号. 解题分析:LCA模板题,下面用的是树上倍增求解. #include <iostream> #inclu ...
- MongoDB+php7搭建
0x00前言: 今天一位非计算机专业的朋友问我怎么打开.bson文件,我第一反应.bson文件是什么,网上查了下是mongodb的传输文件.也就是类似于mysql的.sql文件一样 之前看过mongo ...
- MySQL数据库基本用法-查询
查询的基本语法 select * from 表名; from关键字后面写表名,表示数据来源于是这张表 select后面写表中的列名,如果是*表示在结果中显示表中所有列 在select后面的列名部分,可 ...
- componentWillReceiveProps详解(this.props)状态改变检测机制
参考资料:http://blog.csdn.net/ElinaVampire/article/details/51813677 大家先看一张关于组件挂载的经典的图片: 下面一一说一下这几个生命周期的意 ...
- 服务链路追踪---Sleuth
Sleuth:日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案. 当服务与服务之间调用复杂时,Sp ...
- 9. Fizz Buzz 问题
Description Given number n. Print number from 1 to n. But: when number is divided by 3, print " ...
- vs2010黑色主题Dark完美设置
版权声明:本文为博主原创文章,未经博主允许不得转载. ----------------------------------------------------------------------- ...
- 用java连接RabbitMQ
pom.xml <dependencies> <dependency> <groupId>junit</groupId> <artifactId& ...
- Java并发编程(九)-- 进程饥饿和公平锁
上一章已经提到“如果一个进程被多次回滚,迟迟不能占用必需的系统资源,可能会导致进程饥饿”,本文我们详细的介绍一下“饥饿”和“公平”. Java中导致饥饿的原因 在Java中,下面三个常见的原因会导致线 ...