抽象工廠模式
定義:
抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定類實例的具體類型的情況下,能夠創建多個類實例族的類實例對象。
例如:以上一章節的例子爲例。假如Apple又分爲Apple1和Apple2,Banana也分爲Banana1和Banana2。我們希望對每類水果的每種類型區分, 並可以創建多個水果實例。此時,便可以考慮抽象工廠模式,即:對類實例進一步抽象,對每一種類實例族進行創建。
抽象工廠角色:
public interface FruitFactory {
//實例化Apple
public Fruit getApple();
//實例化Banana
public Fruit getBanana();
}
抽象角色
其中包括公共的抽象角色和具體類的進一步抽象。
public interface Fruit {
public void get();
}
public abstract class Apple implements Fruit{
public abstract void get();
}
public abstract class Banana implements Fruit{
public abstract void get();
}
具體工廠角色
public class Fruit1Factory implements FruitFactory {
public Fruit getApple() {
return new Apple1();
}
public Fruit getBanana() {
return new Banana1();
}
}
public class Fruit2Factory implements FruitFactory {
public Fruit getApple() {
return new Apple2();
}
public Fruit getBanana() {
return new Banana2();
}
}
具體類實例
public class Apple1 extends Apple {
public void get() {
System.out.println("Apple1");
}
}
public class Banana1 extends Banana {
public void get() {
System.out.println("Banana1");
}
}
public class Apple2 extends Apple {
public void get() {
System.out.println("Apple2");
}
}
public class Banana2 extends Banana {
public void get() {
System.out.println("Banana2");
}
}
調用如下:
public class MainClass {
public static void main(String[] args) {
FruitFactory ff = new Fruit1Factory();
Fruit apple = ff.getApple();
apple.get();
Fruit banana = ff.getBanana();
banana.get();
FruitFactory ff2= new Fruit2Factory();
Fruit apple2 = ff2.getApple();
apple2.get();
Fruit banana2 = ff2.getBanana();
banana2.get();
}
}