Abstract Factory Pattern相對於Simple Factory Pattern只是將不同的Factory抽象化後,而多了Abstract Factory這一層。

Manner.java

public interface Manner {
public void eatSomething() ;
}

Person.java

public class Person implements Manner {
public void eatSomething() {
System.out.println("Person eat something");
}
}

Dog.java

public class Dog implements Manner {
public void eatSomething() {
System.out.println("Dog eat something");
}
}

Cat.java

public class Cat implements Manner {
public void eatSomething() {
System.out.println("Cat eat something");
}
}

Exercise.java

interface Exercise {
public void getPlay() ;
}

Adult.java

public class Adult implements Exercise {
@Override
public void getPlay() {
System.out.println("Adult play badminton");
}
}

Child.java

public class Child implements Exercise {
@Override
public void getPlay() {
System.out.println("child play basketball");
}
}

AbstractFactory.java

abstract class AbstractFactory {
public abstract Manner getEat(String type) ; 
public abstract Exercise getPlay(String sport) ; 
}

ExerciseFactory.java

public class ExerciseFactory extends AbstractFactory {
public Exercise getPlay(String sport){
if(sport.equals("Child")){
return new Child() ;
}else if(sport.equals("Adult")){
return new Adult() ;
}
return null ;
}
@Override
public Manner getEat(String type) {
return null;
}
}

MannerFactory.java

public class MannerFactory extends AbstractFactory {
public Manner getEat(String type){
if(type.equals("Person")){
return new Person() ;
}else if(type.equals("Dog")){
return new Dog() ;
}else if(type.equals("Cat")){
return new Cat() ;
}
return null ; 
}
@Override
public Exercise getPlay(String sport) {
return null;
}
}

FactoryProducer.java

public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equals("Exercise")){
return new ExerciseFactory() ;
}else if(choice.equals("Manner")){
return new MannerFactory() ;
}
return null ;
}
}

Main.java

public class Main {
public static void main(String[] args) {
FactoryProducer factoryProducer=new FactoryProducer() ;
factoryProducer.getFactory("Manner").getEat("Person").eatSomething(); 
factoryProducer.getFactory("Manner").getEat("Dog").eatSomething();
factoryProducer.getFactory("Manner").getEat("Cat").eatSomething();

FactoryProducer factoryProducer1=new FactoryProducer() ;
factoryProducer1.getFactory("Exercise").getPlay("Adult").getPlay();
factoryProducer1.getFactory("Exercise").getPlay("Child").getPlay();
}
}