工廠模式(Factory Pattern)

工廠模式

這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來指向新創建的對象。


介紹

應用實例: 1、你需要一輛汽車,可以直接從工廠裏面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裏面的具體實現。
使用場景: 1、日誌記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日誌到什麼地方。


實現

首先創建一個 Shape 接口和實現 Shape 接口的三個實體類,然後創建工廠類ShapeFactory。在演示類FactoryPatternDemo中使用 ShapeFactory 來獲取 Shape 對象。向 ShapeFactory 傳遞信息(circle / rectangle/ square),來獲取所需對象的類型。

步驟1
創建一個接口。
Shape.java

package factorypattern;

public interface Shape {
    void draw();
}

步驟2
創建實現接口的實體類。
Rectangle.java

package factorypattern;

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

Square.java

package factorypattern;

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

Circle.java

package factorypattern;

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

步驟3
創建一個工廠,生成基於給定信息的實體類的對象。
ShapeFactory.java

package factorypattern;

public class ShapeFactory {
    /**
     * 使用getShape方法來獲取形狀類型的對象
     * @param shapeType
     * @return
     */
    public Shape getShape(String shapeType){
        if (shapeType == null){
            return null;
        }else if (shapeType.equalsIgnoreCase("RECTANGLE")){
            return new Rectangle();
        }else if (shapeType.equalsIgnoreCase("SQUARE")){
            return new Square();
        }else if (shapeType.equalsIgnoreCase("CIRCLE")){
            return new Circle();
        }
        return null;
    }
}

步驟4
使用該工廠,通過傳遞類型信息來獲取實體類的對象。
ShapeFactoryDemo.java

package factorypattern;

public class ShapeFactoryDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        Shape shape1 = shapeFactory.getShape("rectangle");
        shape1.draw();

        Shape shape2 = shapeFactory.getShape("square");
        shape2.draw();

        Shape shape3 = shapeFactory.getShape("circle");
        shape3.draw();
    }
}

步驟5
執行程序,輸出結果:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章