- 1.什麼是設計模式?
設計模式是前人根據經驗總結出來的,使用設計模式,就相當於是站在了前人的肩膀上。
設計模式使程序易讀。熟悉設計模式的人應該能夠很容易讀懂運用設計模式編寫的程序。
設計模式能使編寫的程序具有良好的可擴展性,滿足系統設計的開閉原則。比如策略模式,就是將不同的算法封裝在子類中,在需要添加新的算法時,只需添加新的子類,實現規定的接口,即可在不改變現有系統源碼的情況下加入新的系統行爲。
設計模式能降低系統中類與類之間的耦合度。比如工廠模式,使依賴類只需知道被依賴類所實現的接口或繼承的抽象類,使依賴類與被依賴類之間的耦合度降低。
設計模式能提高代碼的重用度。比如適配器模式,就能將系統中已經存在的符合新需求的功能代碼兼容新的需求提出的接口 。
設計模式能爲常見的一些問題提供現成的解決方案。
設計模式增加了重用代碼的方式。比如裝飾器模式,在不使用繼承的前提下重用系統中已存在的代碼。
工廠模式
實現
我們將創建一個 Shape 接口和實現 Shape 接口的實體類。下一步是定義工廠類 ShapeFactory。
FactoryPatternDemo,我們的演示類使用 ShapeFactory 來獲取 Shape 對象。它將向 ShapeFactory 傳遞信息(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需對象的類型。
步驟 1
創建一個接口。
Shape.java
public interface Shape { void draw(); }
步驟 2
創建實現接口的實體類。
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
Square.java
public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
Circle.java
public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
步驟 3
創建一個工廠,生成基於給定信息的實體類的對象。
ShapeFactory.java
public class ShapeFactory { public static <T> T getClass(Class<? extends T> clazz) { T obj = null; try { obj = (T) Class.forName(clazz.getName()).newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return obj; } }
步驟 4
使用該工廠,通過傳遞類型信息來獲取實體類的對象。
FactoryPatternDemo.java
public class FactoryPatternDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); //獲取 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
驗證輸出。
Inside Circle::draw() method. Inside Rectangle::draw() method. Inside Square::draw() method