設計模式——工廠模式

工廠模式

介紹

定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。(創建型模式)

使用場景

例如orm框架,在選擇數據庫的時候只需要替換方言和驅動,不需要對已經實現的具體細節進行改動。

  • 優點:使用工廠模式可以屏蔽具體實現,只需要關心接口的調用;在增加一個產品的時候,只需要在工廠類裏擴展一個產品就可以。
  • 缺點:每增加產品就必須增加具體實現類和實現工廠,增加了系統複雜性。(如果產品非常非常多,233333)

DEMO

工廠模式比較簡單,就寫個最常用的例子:圖形。

package factory.pattern;

/**
 * Created by FK on 2017/6/17.
 */
public interface Shape {
    void draw();
}

創建 shape抽象類

package factory.pattern;

/**
 * Created by FK on 2017/6/17.
 */
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Rectangle : draw()");
    }
}

rectangle實現shape方法

package factory.pattern;

/**
 * Created by FK on 2017/6/17.
 */
public class Circle implements Shape {

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

circle實現shape方法

package factory.pattern;

/**
 * Created by FK on 2017/6/17.
 */
public class Square implements Shape {

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

square實現shape方法

package factory.pattern;

/**
 * Created by FK on 2017/6/17.
 */
public class ShapeFactory {

    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;
    }

}

創建一個工廠,生成基於給傳入值的實體類的對象。

package factory.pattern;

/**
 * Created by FK on 2017/6/17.
 */
public class FactoryPattern {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        Shape circle = shapeFactory.getShape("CIRCLE");
        //調用 Circle 的 draw 方法
        circle.draw();
        Shape rectangle = shapeFactory.getShape("RECTANGLE");
        //調用 Rectangle 的 draw 方法
        rectangle.draw();
        Shape square = shapeFactory.getShape("SQUARE");
        //調用 Square 的 draw 方法
        square.draw();
    }
}

寫個demo來測試下輸出是否實現了工廠模式,輸出如下:

Circle : draw()
Rectangle : draw()
Square : draw()

博客來自
fk5431
http://fk5431.com/20170617/Design_pattern/factory_pattern/
希望去新博客踩踩!

代碼都在github上,地址是fk5431
https://github.com/fk5431/designPatterns

發佈了196 篇原創文章 · 獲贊 18 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章