2015-09-07 13:25:26 +02:00
---
layout: pattern
title: Fluent Interface
folder: fluentinterface
permalink: /patterns/fluentinterface/
2015-09-11 13:08:50 +05:30
categories: Other
tags:
- Java
- Difficulty-Intermediate
2015-12-28 15:52:44 +02:00
- Functional
2015-09-07 13:25:26 +02:00
---
2016-01-03 21:14:30 +01:00
## Intent
A fluent interface provides an easy-readable, flowing interface, that often mimics a domain specific language. Using this pattern results in code that can be read nearly as human language.
2015-09-07 13:25:26 +02:00
2016-01-03 21:14:30 +01:00
## Implementation
2015-09-11 13:08:50 +05:30
A fluent interface can be implemented using any of
* Method Chaining - calling a method returns some object on which further methods can be called.
* Static Factory Methods and Imports
* Named parameters - can be simulated in Java using static factory methods.
2019-12-07 20:01:13 +02:00
## Class diagram
2015-09-07 13:25:26 +02:00

2016-01-03 21:14:30 +01:00
## Applicability
Use the Fluent Interface pattern when
2015-09-07 13:25:26 +02:00
* you provide an API that would benefit from a DSL-like usage
* you have objects that are difficult to configure or use
2016-01-03 21:14:30 +01:00
## Real world examples
2015-09-07 13:25:26 +02:00
* [Java 8 Stream API ](http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html )
* [Google Guava FluentInterable ](https://github.com/google/guava/wiki/FunctionalExplained )
2015-09-11 13:08:50 +05:30
* [JOOQ ](http://www.jooq.org/doc/3.0/manual/getting-started/use-cases/jooq-as-a-standalone-sql-builder/ )
* [Mockito ](http://mockito.org/ )
* [Java Hamcrest ](http://code.google.com/p/hamcrest/wiki/Tutorial )
2016-01-03 21:14:30 +01:00
## Credits
2015-09-11 13:08:50 +05:30
* [Fluent Interface - Martin Fowler ](http://www.martinfowler.com/bliki/FluentInterface.html )
* [Evolutionary architecture and emergent design: Fluent interfaces - Neal Ford ](http://www.ibm.com/developerworks/library/j-eaed14/ )
* [Internal DSL ](http://www.infoq.com/articles/internal-dsls-java )