面試必考點之工廠模式
什麼是工廠模式?
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。
為什麼要使用工廠模式?優缺點?使用場景?
使用目的:定義一個建立物件的介面,讓其子類自己決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。
優點:(1)一個呼叫者想建立一個物件,只要知道其名稱就可以了。(2)擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以(3)遮蔽產品的具體實現,呼叫者只關心產品的介面。
缺點:(1)每次增加一個產品時,都需要增加一個具體類和物件實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。
使用場景:(1)日誌記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日誌到什麼地方(2)資料庫訪問,當用戶不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時(3)設計一個連線伺服器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個介面。
手撕工廠模式怎麼辦?
我們將建立一個 Shape 介面和實現 Shape 介面的實體類。下一步是定義工廠類 ShapeFactory。
FactoryPatternDemo,我們的演示類使用 ShapeFactory 來獲取 Shape 物件。它將向 ShapeFactory 傳遞資訊(CIRCLE / RECTANGLE / SQUARE
步驟 1
建立一個介面。
Shape.java
publicinterfaceShape{void draw();}
步驟 2
建立實現介面的實體類。
Rectangle.java
publicclassRectangleimplementsShape{@Overridepublicvoid draw(){System.out.println("Inside Rectangle::draw() method.");}}
Square.java
publicclassSquareimplementsShape{@Overridepublicvoid draw(){System.out.println("Inside Square::draw() method.");}}
Circle.java
publicclassCircleimplementsShape{@Overridepublicvoid draw(){System.out.println("Inside Circle::draw() method.");}}
步驟 3
建立一個工廠,生成基於給定資訊的實體類的物件。
ShapeFactory.java
publicclassShapeFactory{//使用 getShape 方法獲取形狀型別的物件publicShape getShape(String shapeType){if(shapeType ==null){returnnull;}if(shapeType.equalsIgnoreCase("CIRCLE")){returnnewCircle();}elseif(shapeType.equalsIgnoreCase("RECTANGLE")){returnnewRectangle();}elseif(shapeType.equalsIgnoreCase("SQUARE")){returnnewSquare();}returnnull;}}
步驟 4
使用該工廠,通過傳遞型別資訊來獲取實體類的物件。
FactoryPatternDemo.java
publicclassFactoryPatternDemo{publicstaticvoid main(String[] args){ShapeFactory shapeFactory =newShapeFactory();//獲取 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();}}
步驟 5
驗證輸出。
InsideCircle::draw() method.InsideRectangle::draw() method.InsideSquare::draw() method.
具體內容來源於:http://www.runoob.com/design-pattern/factory-pattern.html