Clean the code
This commit is contained in:
		@@ -1,128 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
layout: pattern
 | 
			
		||||
title: Simple Factory
 | 
			
		||||
folder: simple-factory
 | 
			
		||||
permalink: /patterns/simple-factory/
 | 
			
		||||
categories: Creational
 | 
			
		||||
tags:
 | 
			
		||||
 - Gang of Four
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Also known as
 | 
			
		||||
 | 
			
		||||
* Factory
 | 
			
		||||
* Static Factory Method
 | 
			
		||||
 | 
			
		||||
## Intent
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
**Programmatic Example**
 | 
			
		||||
 | 
			
		||||
We have an interface "Car" and tow implementations "Ford" and "Ferrari".
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
/**
 | 
			
		||||
 * Car interface.
 | 
			
		||||
 */
 | 
			
		||||
public interface Car {
 | 
			
		||||
  
 | 
			
		||||
  public String getDescription();
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Ford implementation.
 | 
			
		||||
 */
 | 
			
		||||
public class Ford implements Car {
 | 
			
		||||
 | 
			
		||||
  static final String DESCRIPTION = "This is Ford.";
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public String getDescription() {
 | 
			
		||||
    return DESCRIPTION;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Ferrari implementation.
 | 
			
		||||
 */
 | 
			
		||||
public class Ferrari implements Car {
 | 
			
		||||
   
 | 
			
		||||
  static final String DESCRIPTION = "This is Ferrari.";
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public String getDescription() {
 | 
			
		||||
    return DESCRIPTION;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Then we have the static method "getCar" to create car objects encapsulated in the factory class "CarSimpleFactory".
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
/**
 | 
			
		||||
 * Factory of cars.
 | 
			
		||||
 */
 | 
			
		||||
public class CarSimpleFactory {
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   * Enumeration for different types of cars.
 | 
			
		||||
   */
 | 
			
		||||
  static enum CarType {
 | 
			
		||||
    FORD, FERRARI
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   * Factory method takes as parameter a car type and initiate the appropriate class.
 | 
			
		||||
   */
 | 
			
		||||
  public static Car getCar(CarType type) {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
      case FORD: return new Ford();
 | 
			
		||||
      case FERRARI: return new Ferrari();
 | 
			
		||||
      default: throw new IllegalArgumentException("Model not supported.");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Now on the client code we can create differentes types of cars(Ford or Ferrari) using the factory class.
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Car car1 = CarSimpleFactory.getCar(CarSimpleFactory.CarType.FORD);
 | 
			
		||||
Car car2 = CarSimpleFactory.getCar(CarSimpleFactory.CarType.FERRARI);
 | 
			
		||||
LOGGER.info(car1.getDescription());
 | 
			
		||||
LOGGER.info(car2.getDescription());
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Program output:
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
This is Ford.
 | 
			
		||||
This Ferrari.
 | 
			
		||||
```
 | 
			
		||||
## Applicability
 | 
			
		||||
 | 
			
		||||
Use the Simple Factory pattern when you only care about the creation of a object, not how to create and manage it.
 | 
			
		||||
 | 
			
		||||
## Disadvantages:
 | 
			
		||||
 | 
			
		||||
The code becomes more complicated than it should be. 
 | 
			
		||||
 | 
			
		||||
## Related patterns
 | 
			
		||||
 | 
			
		||||
[Factory Method](https://java-design-patterns.com/patterns/factory-method/)
 | 
			
		||||
[Factory Kit](https://java-design-patterns.com/patterns/factory-kit/)
 | 
			
		||||
[Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
@startuml
 | 
			
		||||
package com.iluwatar.simplefactory {
 | 
			
		||||
  class App {
 | 
			
		||||
    - LOGGER : Logger {static}
 | 
			
		||||
    + App()
 | 
			
		||||
    + main(args : String[]) {static}
 | 
			
		||||
  }
 | 
			
		||||
  interface Car {
 | 
			
		||||
    + getDescription() : String {abstract}
 | 
			
		||||
  }
 | 
			
		||||
  class CarSimpleFactory {
 | 
			
		||||
    + CarSimpleFactory()
 | 
			
		||||
    + getCar(type : CarType) : Car {static}
 | 
			
		||||
  }
 | 
			
		||||
  ~enum CarType {
 | 
			
		||||
    + FERRARI {static}
 | 
			
		||||
    + FORD {static}
 | 
			
		||||
    + valueOf(name : String) : CarType {static}
 | 
			
		||||
    + values() : CarType[] {static}
 | 
			
		||||
  }
 | 
			
		||||
  class Ferrari {
 | 
			
		||||
    ~ DESCRIPTION : String {static}
 | 
			
		||||
    + Ferrari()
 | 
			
		||||
    + getDescription() : String
 | 
			
		||||
  }
 | 
			
		||||
  class Ford {
 | 
			
		||||
    ~ DESCRIPTION : String {static}
 | 
			
		||||
    + Ford()
 | 
			
		||||
    + getDescription() : String
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
CarType ..+ CarSimpleFactory
 | 
			
		||||
Ferrari ..|> Car 
 | 
			
		||||
Ford ..|> Car 
 | 
			
		||||
@enduml
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
  <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
  <parent>
 | 
			
		||||
    <groupId>com.iluwatar</groupId>
 | 
			
		||||
    <artifactId>java-design-patterns</artifactId>
 | 
			
		||||
    <version>1.24.0-SNAPSHOT</version>
 | 
			
		||||
  </parent>
 | 
			
		||||
  <artifactId>simple-factory</artifactId>
 | 
			
		||||
  <dependencies>
 | 
			
		||||
    <dependency>
 | 
			
		||||
      <groupId>org.junit.jupiter</groupId>
 | 
			
		||||
      <artifactId>junit-jupiter-engine</artifactId>
 | 
			
		||||
      <scope>test</scope>
 | 
			
		||||
    </dependency>
 | 
			
		||||
    <dependency>
 | 
			
		||||
      <groupId>junit</groupId>
 | 
			
		||||
      <artifactId>junit</artifactId>
 | 
			
		||||
    </dependency>
 | 
			
		||||
  </dependencies>
 | 
			
		||||
  <build>
 | 
			
		||||
		<plugins>
 | 
			
		||||
			<!-- Maven assembly plugin is invoked with default setting which we have 
 | 
			
		||||
				in parent pom and specifying the class having main method -->
 | 
			
		||||
			<plugin>
 | 
			
		||||
				<groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
				<artifactId>maven-assembly-plugin</artifactId>
 | 
			
		||||
				<executions>
 | 
			
		||||
					<execution>
 | 
			
		||||
						<configuration>
 | 
			
		||||
							<archive>
 | 
			
		||||
								<manifest>
 | 
			
		||||
									<mainClass>com.iluwatar.simplefactory.App</mainClass>
 | 
			
		||||
								</manifest>
 | 
			
		||||
							</archive>
 | 
			
		||||
						</configuration>
 | 
			
		||||
					</execution>
 | 
			
		||||
				</executions>
 | 
			
		||||
			</plugin>
 | 
			
		||||
		</plugins>
 | 
			
		||||
	</build>
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright © 2014-2019 Ilkka Seppälä
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
 * in the Software without restriction, including without limitation the rights
 | 
			
		||||
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
 * copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package com.iluwatar.simplefactory;
 | 
			
		||||
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
public class App {
 | 
			
		||||
  
 | 
			
		||||
  private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   * Program main entry point.
 | 
			
		||||
   */
 | 
			
		||||
  public static void main(String[] args) {
 | 
			
		||||
    Car car1 = CarSimpleFactory.getCar(CarSimpleFactory.CarType.FORD);
 | 
			
		||||
    Car car2 = CarSimpleFactory.getCar(CarSimpleFactory.CarType.FERRARI);
 | 
			
		||||
    LOGGER.info(car1.getDescription());
 | 
			
		||||
    LOGGER.info(car2.getDescription());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
package com.iluwatar.simplefactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Car interface.
 | 
			
		||||
 */
 | 
			
		||||
public interface Car {
 | 
			
		||||
  
 | 
			
		||||
  public String getDescription();
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
@@ -1,25 +0,0 @@
 | 
			
		||||
package com.iluwatar.simplefactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Factory of cars.
 | 
			
		||||
 */
 | 
			
		||||
public class CarSimpleFactory {
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   * Enumeration for different types of cars.
 | 
			
		||||
   */
 | 
			
		||||
  static enum CarType {
 | 
			
		||||
    FORD, FERRARI
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   * Factory method takes as parameter a car type and initiate the appropriate class.
 | 
			
		||||
   */
 | 
			
		||||
  public static Car getCar(CarType type) {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
      case FORD: return new Ford();
 | 
			
		||||
      case FERRARI: return new Ferrari();
 | 
			
		||||
      default: throw new IllegalArgumentException("Model not supported.");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
package com.iluwatar.simplefactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Ferrari implementation.
 | 
			
		||||
 */
 | 
			
		||||
public class Ferrari implements Car {
 | 
			
		||||
   
 | 
			
		||||
  static final String DESCRIPTION = "This is Ferrari.";
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public String getDescription() {
 | 
			
		||||
    return DESCRIPTION;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
package com.iluwatar.simplefactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Ford implementation.
 | 
			
		||||
 */
 | 
			
		||||
public class Ford implements Car {
 | 
			
		||||
 | 
			
		||||
  static final String DESCRIPTION = "This is Ford.";
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public String getDescription() {
 | 
			
		||||
    return DESCRIPTION;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
package com.iluwatar.simplefactory;
 | 
			
		||||
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.*;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
 | 
			
		||||
class AppTest {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void shouldExecuteWithoutExceptions() {
 | 
			
		||||
		assertDoesNotThrow(() -> App.main(new String[]{}));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
package com.iluwatar.simplefactory;
 | 
			
		||||
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.*;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
 | 
			
		||||
class CarSimpleFactoryTest {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void shouldReturnFerrariInstance() {
 | 
			
		||||
		final var ferrari = CarSimpleFactory.getCar(CarSimpleFactory.CarType.FERRARI);
 | 
			
		||||
		assertTrue(ferrari instanceof Ferrari);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user