抽象工廠模式
實例:除了上篇簡單工廠模式畫形狀的功能,我們還需要給形狀塗色,所以還需要有顏色工廠。此時我們將所有工廠抽象出來設計成抽象工廠,並建立一個工廠生產器。
- 優點:能保證客戶端始終只使用某一個既定的工廠。
- 缺點:工廠擴展非常困難,要增加一個工廠,既要在抽象工廠里加代碼,又要在具體工廠生產器里加代碼。
//形狀
public interface Shape {
void draw();
}
//圓形
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("畫圓");
}
}
//方形
public class Square implements Shape {
@Override
public void draw() {
System.out.println("畫方");
}
}
//顏色
public interface Color {
void fill();
}
//紅色
public class Red implements Color {
@Override
public void fill() {
System.out.println("塗紅");
}
}
//綠色
public class Green implements Color {
@Override
public void fill() {
System.out.println("塗綠");
}
}
//抽象工廠
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape) ;
}
//形狀工廠
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
@Override
public Color getColor(String color) {
return null;
}
}
//顏色工廠
public class ColorFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
return null;
}
@Override
public Color getColor(String color) {
if(color == null){
return null;
}
if(color.equalsIgnoreCase("RED")){
return new Red();
} else if(color.equalsIgnoreCase("GREEN")){
return new Green();
}
return null;
}
}
//工廠生產器
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("SHAPE")){
return new ShapeFactory();
} else if(choice.equalsIgnoreCase("COLOR")){
return new ColorFactory();
}
return null;
}
}
//使用示例
public class Demo {
public static void main(String[] args) {
//獲取形狀工廠
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
//獲取形狀爲 Circle 的對象
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
//獲取形狀爲 Square 的對象
Shape shape2 = shapeFactory.getShape("SQUARE");
shape2.draw();
//獲取顏色工廠
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
//獲取顏色爲 Red 的對象
Color color1 = colorFactory.getColor("RED");
color1.fill();
//獲取顏色爲 Green 的對象
Color color2 = colorFactory.getColor("GREEN");
color2.fill();
}
}