工廠模式屬於建立型模式,它提供了一種建立對象的最佳方式。
設計意圖:有一個接口,它有多個子類,此時定義一個工廠類,該類用於管理子類的建立。
什麼時候使用:不一樣的條件須要建立不一樣的實例。
應用場景:
1>日誌記錄器:日誌能夠保存到本地硬盤、系統事件與遠程服務器等,用戶能夠選擇日誌存放到什麼地方。即用戶不一樣的想法須要建立不一樣的實例(硬盤、系統事件、遠程服務器等)。
2>數據庫訪問:數據庫的種類有多種,用戶根據不一樣的須要選擇不一樣的數據庫0。
3>鏈接服務器的協議:用戶選擇不一樣的協議鏈接不一樣的服務器。java
實現
1.建立一個shape接口數據庫
public interface Shape { void draw(); }
2.建立接口的實現類
//Circle.java服務器
public class Circle implements Shape { @Override public void draw() { System.out.println("Circle"); } }
//Rectangle.javaide
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Rectangle"); } }
3.建立一個工廠類,用於管理接口子類
//ShapeFactory.java測試
public class ShapeFactory { public Shape getShape(String shapeType){ if (shapeType == null) { return null; } //根據不一樣的條件,建立不一樣的實例 if (shapeType.equals("circle")) { return new Circle(); }else if (shapeType.equals("rectangle")) { return new Rectangle(); } return null; } }
4.使用
//FactoryDemo設計
public class FactoryDemo { public static void main(String[] args) { /** * 不使用工廠模式 * 假設建立子實例是一個很繁瑣的過程 * 則每次要使用一個新實例的時候,都須要作建立新實例重複的過程 */ Shape shapeN1 = new Circle(); shapeN1.draw(); Shape shapeN2 = new Rectangle(); shapeN2.draw(); /** * 使用工廠模式 * 建立一個工廠類,完成 建立子類對象的一些繁瑣的過程 * 用戶只須要知道須要建立一個什麼名稱的新對象便可 * 這樣能夠隱藏對象的建立過程 */ //建立工廠類對象 ShapeFactory shapeFactory = new ShapeFactory(); //獲取circle對象,調用它的方法 Shape shape1 = shapeFactory.getShape("circle"); shape1.draw(); //獲取rectangle對象,調用它的方法 Shape shape2 = shapeFactory.getShape("rectangle"); shape2.draw(); } }
5.輸出結果日誌
Circle Rectangle
6.如上的工廠模式(模式1)能夠改進 在模式1中,若是用戶須要新增一個形狀類(如Square.java),則用戶須要修改工廠類和新增Square類。 以下模式2,能夠改善模式1 修改工廠類以下code
public class ShapeFactory { public static Shape getShapeInstance(String shapeType) { if (shapeType == null) { return null; } Shape shape = null; try { // 利用反射獲得圖形類型 shape = (Shape) Class.forName("com.readygo.test." + shapeType).newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO: handle exception } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return shape; } }
則對應的測試爲對象
public class FactoryDemo { public static void main(String[] args) { /** * 對比模式1與模式2 * 模式1:咱們建立的形狀實例必須是工廠類中定義了的, * 若是咱們須要建立一個新的形狀實例,則須要修改工廠類,同時增長這個新的實例 * * 模式2:利用反射機制獲得形狀類型, * 當咱們須要增長一種新的形狀時,不須要修改工廠類,只須要增長要實現的類便可 * 從而達到了工廠分離的效果 */ Shape shape = ShapeFactory.getShapeInstance("Rectangle"); if (shape != null) { shape.draw(); }else { System.out.println("不存在這種對象"); } } }