1. 程式人生 > >設計模式之工廠模式——Java語言描述

設計模式之工廠模式——Java語言描述

工廠模式是Java中常見的設計模式之一,該設計模式屬於建立型模式,提供了一種建立物件的最佳方式。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件

介紹

應用例項

當我們需要購買一輛汽車時,只需要從工廠提貨而不需要知道汽車是如何製造出來的以及這個汽車的具體實現。

優點

  1. 呼叫者只需要知道物件的名稱就可以建立一個物件
  2. 拓展性高
  3. 遮蔽產品的具體實現,呼叫者只關心產品的介面

缺點

每次增加一個產品時,都需要響應的增加一個具體類以及物件實現工廠,使得系統中的類的個數成倍增加。一定程度上增加了系統的複雜度,以及系統對具體類的依賴。

實現

我們將會建立一個能夠產生實現了Shape介面的實體類,專案的UML圖如下:
工廠模式的UML圖

建立一個介面

public interface Shape {
    void draw();
}

建立實體類

Rectangle.java

public class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

Square.java

public
class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }

Circle.java

public class Circle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

建立工廠類

ShapeFactory.java

public class ShapeFactory {
    
   //使用 getShape 方法獲取形狀型別的物件
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }        
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}

使用工廠類

FactoryPatternDemo.java

public class FactoryPatternDemo {
 
   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();
 
      //獲取 Circle 的物件,並呼叫它的 draw 方法
      Shape shape1 = shapeFactory.getShape("CIRCLE");
 
      //呼叫 Circle 的 draw 方法
      shape1.draw();
 
      //獲取 Rectangle 的物件,並呼叫它的 draw 方法
      Shape shape2 = shapeFactory.getShape("RECTANGLE");
 
      //呼叫 Rectangle 的 draw 方法
      shape2.draw();
 
      //獲取 Square 的物件,並呼叫它的 draw 方法
      Shape shape3 = shapeFactory.getShape("SQUARE");
 
      //呼叫 Square 的 draw 方法
      shape3.draw();
   }
}

輸出結果

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.

Java 填坑手冊。分享知識,共同進步。歡迎轉載、fork