本文由 ImportNew - 唐小娟 翻译自 Journaldev。如需转载本文,请先参见文章末尾处的转载要求。

ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Java开发 小组。参与方式请查看小组简介。

我写过一篇《如何创建不可变类》。这篇文章中,我们将看到如何使用建造者模式创建不可变类。当构造器中的参数很多时,并且参数的顺序会给人造成困扰的时候,那么使用建造者模式来创建不可变类就是非常好的方法了。

使用建造者模式来创建不可变类

下面是使用建造者模式来创建不可变类的例子:

ImmutableClass.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package

com.journaldev.design.builder;
 
import

java.util.HashMap;
 
public

class

ImmutableClass {
 
    //required
fields
    private

int

id;
    private

String name;
 
    //optional
fields
    private

HashMap properties;
    private

String company;
 
    public

int

getId() {
        return

id;
    }
 
    public

String getName() {
        return

name;
    }
 
    public

HashMap getProperties() {
        //return
cloned object to avoid changing it by the client application
        return

(HashMap) properties.clone();
    }
 
    public

String getCompany() {
        return

company;
    }
 
    private

ImmutableClass(ImmutableClassBuilder builder) {
        this.id
= builder.id;
        this.name
= builder.name;
        this.properties
= builder.properties;
        this.company
= builder.company;
    }
 
        //Builder
class
    public

static

class

ImmutableClassBuilder{
        //required
fields
        private

int

id;
        private

String name;
 
        //optional
fields
        private

HashMap properties;
        private

String company;
 
        public

ImmutableClassBuilder(
int

i, String nm){
            this.id=i;
            this.name=nm;
        }
 
        public

ImmutableClassBuilder setProperties(HashMap hm){
            this.properties
= (HashMap) hm.clone();
            return

this
;
        }
 
        public

ImmutableClassBuilder setCompany(String comp){
            this.company
= comp;
            return

this
;
        }
 
        public

ImmutableClass build(){
            return

new

ImmutableClass(
this);
        }
    }
}

下面的测试代码为我们测试到底创建的对象是不是不可变的。

ImmutableBuilderTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package

com.journaldev.design.test;
 
import

java.util.HashMap;
 
import

com.journaldev.design.builder.ImmutableClass;
 
public

class

ImmutableBuilderTest {
 
    public

static

void

main(String[] args) {
 
        //
Getting immutable class only with required parameters
        ImmutableClass
immutableClass =
new

ImmutableClass.ImmutableClassBuilder(
1,
"Pankaj").build();
 
        HashMap
hm =
new

HashMap();
        hm.put("Name",
"Pankaj");
        hm.put("City",
"San
Jose"
);
        //
Getting immutable class with optional parameters
        ImmutableClass
immutableClass1 =
new

ImmutableClass.ImmutableClassBuilder(
1,
"Pankaj")
                                                     .setCompany("Apple").setProperties(hm).build();
 
        //Testing
immutability
        HashMap
hm1 = immutableClass1.getProperties();
 
        //lets
modify the Object passed as argument or get from the Object
        hm1.put("test",
"test");
 
        //check
that immutable class properties are not changed
        System.out.println(immutableClass1.getProperties());
    }
 
}

重要的知识点

  • 不可变类只有getter方法
  • 不可变类只有一个私有的构造器,以Builder对象作为参数来创建不可变对象
  • 如果不可变类的成员变量是可变的(譬如HashMap),我们需要使用深拷贝(deep copy)或者克隆来防止成员变量被更改
  • 当可选的成员变量很多的时候,使用建造者模式创建不可变类是不错的方法
  • 原文链接: Journaldev 翻译: ImportNew.com唐小娟

    译文链接: http://www.importnew.com/7860.html

如何使用建造者模式(Builder Pattern)创建不可变类的更多相关文章

  1. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  3. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  4. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  5. 建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...

  6. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  7. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  8. 六个创建模式之建造者模式(Builder Pattern)

    定义: 将一个复杂的对象的构建与它的表示分类,使得同样的构建过程可以创建不同的表示.建造者模式一步步地创建一个复杂对象,但用户仅需指定对象的类型和内容,不需要关心各个部分之间的关联关系. 结构图: B ...

  9. Net设计模式实例之建造者模式(Builder Pattern)

    一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...

  10. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

随机推荐

  1. 【YashanDB数据库】yasboot查询数据库状态时显示数据库状态为off

    [问题现象] yasboot cluster status -c yashandb 显示数据库状态为off与数据库实际的状态不符,如下图 [问题分类]yasboot.yasdb使用问题 [关键字]ya ...

  2. java 知识

    1. 单文件java 例子和简单项目例子 http://kleinfelter.com/java-hello-world-with-visual-studio-code-and-eclipse jav ...

  3. 鸿蒙系统(HarmonyOS)全局弹窗实现

    全局弹窗相对于自定义弹窗有以下优点: 封装更彻底,一行代码就能调用 跟组件耦合度低,只需要传入组件的UIContext对象,不需要跟自定义弹窗一样需要在组件内部实例化CustomDialogContr ...

  4. JavaScript – 类型转换

    介绍 JS 是弱类型语言, 在编程时, 有许多自动类型转换的技巧, 虽然大家都不太鼓励, 尤其是用了 TypeScript 之后, 但无可否认自动转换很方便, 看上去也很干净. 所以这篇还是要介绍一些 ...

  5. MyBatis——快速入门

    MyBatis 快速入门     查询 tb_user 的所有信息   1.创建tb_user表,添加数据 create database mybatis; use mybatis; drop tab ...

  6. 【解决方案】Java 互联网项目中常见的 Redis 缓存应用场景

    目录 前言 一.常见 key-value 二.时效性强 三.计数器相关 四.高实时性 五.排行榜系列 六.文章小结 前言 在笔者 3 年的 Java 一线开发经历中,尤其是一些移动端.用户量大的互联网 ...

  7. About CSP

    好了,猜猜今年第一题会考什么 linux 终端指令 这样吧 CTH 装了 ubuntu 系统的电脑被人施加了 rm -rf /home/Desktop/ 指令,导致他打不开桌面了,以下哪一个是 CTH ...

  8. [TK] 送礼物

    题解引用 引理1: 区间 \([l,r]\) 是最优解的必要不充分条件是: \(l,r\) 分别是区间的最小值与最大值. 这很显然,若假设不成立,当区间向内缩小时,一定有分子不变,分母变小,进而算出更 ...

  9. 安装mysql5.7报错启动失败(3534)的处理

    一 ,在官网下载好了mysql5.7之后,解压到对应的文件的夹下 二, 在cmd中进入到mysql下单bin目录下,一定要是管理员权限,执行mysqld --initialize 命令,会看到根目录下 ...

  10. usb请求块以及提交方式

    URB结构体 struct urb { /* private: usb core and host controller only fields in the urb */ struct kref k ...