抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
直接上demo.先程式碼,後介紹。
如果在之前你沒有看過工廠模式,請坐下面的時光機傳送,不光是思想基礎,主要是演變的過程要知道。設計模式快速學習(一)工廠模式
1. 編寫介面Shape
Shape.java
public interface Shape {
void draw();
}複製程式碼
2. 編寫介面Shape的實現類Rectangle
Rectangle.java
/** * Created by Fant.J. */public class Rectangle implements Shape {
@Override public void describe() {
System.out.println("我是個長方形");
}
}複製程式碼
3. 編寫介面Shape的實現類Circle
Circle .java
/** * Created by Fant.J. */public class Circle implements Shape {
@Override public void describe() {
System.out.println("我是個圓形");
}
}複製程式碼
4. 編寫介面Color
Color .java
/** * Created by Fant.J. */public interface Color {
void fill();
}複製程式碼
5. 編寫介面Color 的實現類Red
Red .java
/** * Created by Fant.J. */public class Red implements Color {
@Override public void fill() {
System.out.println("填充了紅色");
}
}複製程式碼
6. 編寫介面Color 的實現類Green
Green .java
/** * Created by Fant.J. */public class Green implements Color {
@Override public void fill() {
System.out.println("填充了綠色");
}
}複製程式碼
7. 為 Color 和 Shape 物件建立抽象類來獲取工廠
/** * Created by Fant.J. */public abstract class AbstractFactory {
abstract Color getColor(String color);
abstract <
T>
T getShape(Class<
T>
clazz) ;
}複製程式碼
8. 擴充套件(繼承)AbstractFactory 工廠類,使其可以生成實體類Shape的物件
ShapeFactory .java
/** * Created by Fant.J. */public class ShapeFactory extends AbstractFactory {
@Override public Color getColor(String color) {
return null;
} @Override <
T>
T getShape(Class<
T>
clazz) {
T obj = null;
try {
obj = clazz.getDeclaredConstructor().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} return obj;
}
}複製程式碼
9. 擴充套件(繼承)AbstractFactory 工廠類,使其可以生成實體類Color的物件 . 略
10. 建立工廠生成器,用來生成Shape 或 Color 工廠
FactoryProducer .java
/** * Created by Fant.J. */public class FactoryProducer {
public static <
T>
AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("SHAPE")){
return new ShapeFactory();
} else if(choice.equalsIgnoreCase("COLOR")){
//這裡不舉例子了,你可以自己 建立一個 ColorFactory return null;
} return null;
}
}複製程式碼
11. 測試
/** * Created by Fant.J. */public class Test {
public static void main(String[] args) {
//抽象類不能直接呼叫,所以我們例項化 只能例項其子類物件 AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
shapeFactory.getShape(Circle.class).describe();
}
}複製程式碼
總結
這個實現看起來很複雜,我把大概思路總結一下:首先,我們可以通過 工廠生成器來生成一個抽象工廠類,然後呼叫抽象工廠類的擴充套件類(子類)方法。