代碼詳解設計模式--抽象工廠模式

抽象工廠模式

  實例:除了上篇簡單工廠模式畫形狀的功能,我們還需要給形狀塗色,所以還需要有顏色工廠。此時我們將所有工廠抽象出來設計成抽象工廠,並建立一個工廠生產器

  • 優點:能保證客戶端始終只使用某一個既定的工廠。
  • 缺點:工廠擴展非常困難,要增加一個工廠,既要在抽象工廠里加代碼,又要在具體工廠生產器里加代碼。
    UML
//形狀
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();
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章