設計模式快速學習(二)抽象工廠模式

微笑面對生活發表於2019-01-08

抽象工廠模式(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();

}
}複製程式碼

總結

這個實現看起來很複雜,我把大概思路總結一下:首先,我們可以通過 工廠生成器來生成一個抽象工廠類,然後呼叫抽象工廠類的擴充套件類(子類)方法。

來源:https://juejin.im/post/5c34b4e6e51d45522263f5f9

相關文章