Aggregate calls to microservices in a single location, the API Gateway. The user makes a single call
@@ -146,6 +150,7 @@ public class ApiGateway {
```
## Class diagram

## Applicability
@@ -160,3 +165,4 @@ Use the API Gateway pattern when
* [NGINX - Building Microservices: Using an API Gateway](https://www.nginx.com/blog/building-microservices-using-an-api-gateway/)
* [Microservices Patterns: With examples in Java](https://www.amazon.com/gp/product/1617294543/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617294543&linkId=ac7b6a57f866ac006a309d9086e8cfbd)
Providing a static method encapsulated in a class called factory, in order to hide the implementation logic and makes client code focus on usage rather then initialization new objects.
Providing a static method encapsulated in a class called factory, in order to hide the
implementation logic and makes client code focus on usage rather then initialization new objects.
## Explanation
Real world example
> Lets say we have a web application connected to SQLServer, but now we want to switch to Oracle. To do so without modifying existing source code, we need to implements Simple Factory pattern, in which a static method can be invoked to create connection to a given database.
> Lets say we have a web application connected to SQLServer, but now we want to switch to Oracle. To
> do so without modifying existing source code, we need to implements Simple Factory pattern, in
> which a static method can be invoked to create connection to a given database.
Wikipedia says
> Factory is an object for creating other objects – formally a factory is a function or method that returns objects of a varying prototype or class.
> Factory is an object for creating other objects – formally a factory is a function or method that
> returns objects of a varying prototype or class.
**Programmatic Example**
We have an interface 'Car' and tow implementations 'Ford' and 'Ferrari'.
We have an interface `Car` and two implementations `Ford` and `Ferrari`.
```java
/**
* Car interface.
*/
publicinterfaceCar{
publicStringgetDescription();
StringgetDescription();
}
/**
* Ford implementation.
*/
publicclassFordimplementsCar{
staticfinalStringDESCRIPTION="This is Ford.";
@@ -54,9 +50,6 @@ public class Ford implements Car {
}
}
/**
* Ferrari implementation.
*/
publicclassFerrariimplementsCar{
staticfinalStringDESCRIPTION="This is Ferrari.";
@@ -68,14 +61,11 @@ public class Ferrari implements Car {
}
```
Enumeration above represents types of cars that we support (Ford and Ferrari).
Enumeration above represents types of cars that we support (`Ford` and `Ferrari`).
```java
publicenumCarType{
/**
* Enumeration for different types of cars.
*/
FORD(Ford::new),
FERRARI(Ferrari::new);
@@ -90,17 +80,12 @@ public enum CarType {
}
}
```
Then we have the static method 'getCar' to create car objects encapsulated in the factory class 'CarSimpleFactory'.
Then we have the static method `getCar` to create car objects encapsulated in the factory class
`CarSimpleFactory`.
```java
/**
* Factory of cars.
*/
publicclassCarsFactory{
/**
* Factory method takes as parameter a car type and initiate the appropriate class.
*/
publicstaticCargetCar(CarTypetype){
returntype.getConstructor().get();
}
@@ -122,23 +107,27 @@ Program output:
ThisisFord.
ThisFerrari.
```
## Class Diagram

## Applicability
Use the Simple Factory pattern when you only care about the creation of a object, not how to create and manage it.
## Pros
Use the Simple Factory pattern when you only care about the creation of a object, not how to create
and manage it.
Pros
* Allows keeping all objects creation in one place and avoid of spreading 'new' key value across codebase.
* Allows to writs loosely coupled code. Some of its main advantages include better testability, easy-to-understand code, swappable components, scalability and isolated features.
## Cons
Cons
* The code becomes more complicated than it should be.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.