I need a code review on my Abstract Factory pattern written in Java.
Find the two enums AnimalType.java and DietType.java below.
package com.patterns.abstractfactory.three;
public enum AnimalType {
TERRESTRIAL("\nLeave on land and breath with lungs.\n"), AQUATIC("\nLeave in water and breath with gills.\n");
private String demo;
AnimalType(String demo) {
this.demo = demo;
}
@Override
public String toString(){
return this.demo;
}
}
package com.patterns.abstractfactory.three;
public enum DietType {
CARNIVORE("\nFeed on flesh\n"), HERBIVORE("\nFeed on plants\n");
private String demo;
DietType(String demo){
this.demo = demo;
}
@Override
public String toString(){
return this.demo;
}
}
Animal.java Interface:
package com.patterns.abstractfactory.three;
public interface Animal {
void info();
}
Deer.java:
package com.patterns.abstractfactory.three;
public class Deer implements Animal{
private AnimalType at;
public Deer(AnimalType at){
this.at = at;
}
@Override
public void info() {
System.out.println(" This is Deer ");
System.out.println(at);
}
}
Lion.java:
package com.patterns.abstractfactory.three;
public class Lion implements Animal{
private AnimalType at;
public Lion(AnimalType at){
this.at = at;
}
@Override
public void info() {
System.out.println(" This is beasty lion ");
System.out.println(at);
}
}
Shark.java:
package com.patterns.abstractfactory.three;
public class Shark implements Animal{
private AnimalType at;
public Shark(AnimalType at){
this.at = at;
}
@Override
public void info() {
System.out.println(" This is Shark fish ");
System.out.println(at);
}
}
Turtle.java:
package com.patterns.abstractfactory.three;
public class Turtle implements Animal{
private AnimalType at;
public Turtle(AnimalType at){
this.at = at;
}
@Override
public void info() {
System.out.println("This is sea turtle");
System.out.println(at);
}
}
AnimalFactory.java:
package com.patterns.abstractfactory.three;
public interface AnimalFactory {
Animal createAnimal(DietType dietType) throws Exception;
}
LandAnimalFactory.java:
package com.patterns.abstractfactory.three;
public class LandAnimalFactory implements AnimalFactory{
private AnimalType at;
public LandAnimalFactory(AnimalType at){
this.at = at;
}
@Override
public Animal createAnimal(DietType dietType) throws Exception {
Animal animal = null;
if(dietType == DietType.CARNIVORE){
animal = new Lion(at);
}else if(dietType == DietType.HERBIVORE){
animal = new Deer(at);
}else{
throw new Exception(" Not able to create Land Animal ");
}
return animal;
}
}
OceanAnimalFactory.java:
package com.patterns.abstractfactory.three;
public class OceanAnimalFactory implements AnimalFactory{
private AnimalType at;
public OceanAnimalFactory(AnimalType at){
this.at = at;
}
@Override
public Animal createAnimal(DietType dt) throws Exception{
Animal animal = null;
if(dt == DietType.CARNIVORE){
animal = new Shark(at);
}else if(dt == DietType.HERBIVORE){
animal = new Turtle(at);
}else{
throw new Exception(" Not able to create Ocean Animal ");
}
return animal;
}
}
AnimalTypeFactory.java:
package com.patterns.abstractfactory.three;
public abstract class AnimalTypeFactory {
public abstract AnimalFactory createFactory();
}
TerrestrialAnimalFactory.java:
package com.patterns.abstractfactory.three;
public class TerrestrialAnimalFactory extends AnimalTypeFactory{
@Override
public AnimalFactory createFactory() {
return new LandAnimalFactory(AnimalType.TERRESTRIAL);
}
}
AquaticAnimalFactory.java:
package com.patterns.abstractfactory.three;
public class AquaticAnimalFactory extends AnimalTypeFactory {
@Override
public AnimalFactory createFactory() {
return new OceanAnimalFactory(AnimalType.AQUATIC);
}
}
MainTestClass.java:
package com.patterns.abstractfactory.three;
public class MainTestClass {
public static void main(String [] args){
Animal animal = null;
AnimalTypeFactory animalTypeFactory = null;
AnimalFactory animalFactory = null;
try{
animalTypeFactory = new TerrestrialAnimalFactory();
animalFactory = animalTypeFactory.createFactory();
animal = animalFactory.createAnimal(DietType.CARNIVORE);
animal.info();
}catch(Exception e){
e.printStackTrace();
}
}
}
From the above implementation of the Abstract Factory pattern, can you please review and tell me whether I have achieved it? If not, can you please tell me how I can improve my pattern in the code?