1. 程式人生 > >面試必考點之工廠模式

面試必考點之工廠模式

什麼是工廠模式?

工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。

為什麼要使用工廠模式?優缺點?使用場景?

使用目的:定義一個建立物件的介面,讓其子類自己決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。

優點:(1)一個呼叫者想建立一個物件,只要知道其名稱就可以了。(2)擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以(3)遮蔽產品的具體實現,呼叫者只關心產品的介面。

缺點:(1)每次增加一個產品時,都需要增加一個具體類和物件實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。

使用場景:(1)日誌記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日誌到什麼地方(2)資料庫訪問,當用戶不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時(3)設計一個連線伺服器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個介面。

手撕工廠模式怎麼辦?

我們將建立一個 Shape 介面和實現 Shape 介面的實體類。下一步是定義工廠類 ShapeFactory

FactoryPatternDemo,我們的演示類使用 ShapeFactory 來獲取 Shape 物件。它將向 ShapeFactory 傳遞資訊(CIRCLE / RECTANGLE / SQUARE

),以便獲取它所需物件的型別。

工廠模式的 UML 圖

步驟 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