Java Adventure Game Factory Design
Example
Intent:
Define an interface for creating an object, but let sub classes decide which class to instantiate. Factory Method lets a class defer instantiation to sub classes.
UML diagram:
Product: It defines an interface of the objects the Factory method creates.
ConcreteProduct: Implements Product interface
Creator: Declares the Factory method
ConcreateCreator: Implements the Factory method to return an instance of a ConcreteProduct
Problem statement: Create a Factory of Games by using Factory Methods, which defines the game interface.
Code snippet:
import java.util.HashMap; /* Product interface as per UML diagram */ interface Game{ /* createGame is a complex method, which executes a sequence of game steps */ public void createGame(); } /* ConcreteProduct implementation as per UML diagram */ class Chess implements Game{ public Chess(){ createGame(); } public void createGame(){ System.out.println("---------------------------------------"); System.out.println("Create Chess game"); System.out.println("Opponents:2"); System.out.println("Define 64 blocks"); System.out.println("Place 16 pieces for White opponent"); System.out.println("Place 16 pieces for Black opponent"); System.out.println("Start Chess game"); System.out.println("---------------------------------------"); } } class Checkers implements Game{ public Checkers(){ createGame(); } public void createGame(){ System.out.println("---------------------------------------"); System.out.println("Create Checkers game"); System.out.println("Opponents:2 or 3 or 4 or 6"); System.out.println("For each opponent, place 10 coins"); System.out.println("Start Checkers game"); System.out.println("---------------------------------------"); } } class Ludo implements Game{ public Ludo(){ createGame(); } public void createGame(){ System.out.println("---------------------------------------"); System.out.println("Create Ludo game"); System.out.println("Opponents:2 or 3 or 4"); System.out.println("For each opponent, place 4 coins"); System.out.println("Create two dices with numbers from 1-6"); System.out.println("Start Ludo game"); System.out.println("---------------------------------------"); } } /* Creator interface as per UML diagram */ interface IGameFactory { public Game getGame(String gameName); } /* ConcreteCreator implementation as per UML diagram */ class GameFactory implements IGameFactory { HashMap<String,Game> games = new HashMap<String,Game>(); /* Since Game Creation is complex process, we don't want to create game using new operator every time. Instead we create Game only once and store it in Factory. When client request a specific game, Game object is returned from Factory instead of creating new Game on the fly, which is time consuming */ public GameFactory(){ games.put(Chess.class.getName(),new Chess()); games.put(Checkers.class.getName(),new Checkers()); games.put(Ludo.class.getName(),new Ludo()); } public Game getGame(String gameName){ return games.get(gameName); } } public class NonStaticFactoryDemo{ public static void main(String args[]){ if ( args.length < 1){ System.out.println("Usage: java FactoryDemo gameName"); return; } GameFactory factory = new GameFactory(); Game game = factory.getGame(args[0]); System.out.println("Game="+game.getClass().getName()); } }
output:
java NonStaticFactoryDemo Chess --------------------------------------- Create Chess game Opponents:2 Define 64 blocks Place 16 pieces for White opponent Place 16 pieces for Black opponent Start Chess game --------------------------------------- --------------------------------------- Create Checkers game Opponents:2 or 3 or 4 or 6 For each opponent, place 10 coins Start Checkers game --------------------------------------- --------------------------------------- Create Ludo game Opponents:2 or 3 or 4 For each opponent, place 4 coins Create two dices with numbers from 1-6 Start Ludo game --------------------------------------- Game=Chess
This example shows a Factory
class by implementing a FactoryMethod
.
-
Game
is the interface for all type of games. It defines complex method:createGame()
-
Chess, Ludo, Checkers
are different variants of games, which provide implementation tocreateGame()
-
public Game getGame(String gameName)
isFactoryMethod
inIGameFactory
class -
GameFactory
pre-creates different type of games in constructor. It implementsIGameFactory
factory method. -
game Name is passed as command line argument to
NotStaticFactoryDemo
-
getGame
inGameFactory
accepts a game name and returns correspondingGame
object.
When to use:
- Factory : When you don't want to expose object instantiation logic to the client/caller
- Abstract Factory : When you want to provide interface to families of related or dependent objects without specifying their concrete classes
- Factory Method: To define an interface for creating an object, but let the sub-classes decide which class to instantiate
Comparison with other creational patterns:
-
Design start out using Factory Method (less complicated, more customizable, subclasses proliferate) and evolve toward Abstract Factory, Prototype, or Builder (more flexible, more complex) as the designer discovers where more flexibility is needed
-
Abstract Factory classes are often implemented with Factory Methods, but they can also be implemented using Prototype
References for further reading: Sourcemaking design-patterns
Java Adventure Game Factory Design
Source: https://riptutorial.com/design-patterns/example/12131/factory-example-by-implementing-factory-method--java-
Posted by: shirleyrequed.blogspot.com
0 Response to "Java Adventure Game Factory Design"
Post a Comment