一、學習目標 瞭解工廠模式基本概念 瞭解工廠模式優點 工廠模式實例 二、基本概念 工廠模式(Factory Pattern)是Java中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共 ...
一、學習目標
- 瞭解工廠模式基本概念
- 瞭解工廠模式優點
- 工廠模式實例
二、基本概念
工廠模式(Factory Pattern)是Java中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的介面來指向新創建的對象。初始化工作如果是很長一段代碼,說明要做的工作很多,將很多工作裝入一個方法中,相當於將很多雞蛋放在一個籃子里,是很危險的,這也是有悖於Java面向對象的原則,面向對象的封裝(Encapsulation)和分派(Delegation)告訴我們,儘量將長的代碼分派“切割”成每段,將每段再“封裝”起來(減少段和段之間耦合聯繫性),這樣,就會將風險分散,以後如果需要修改,只要更改每段,不會再發生牽一動百的事情。
三、工廠模式優缺點
3.1 優點
- 一個調用者想創建一個對象,只要知道其名稱就可以了
- 擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。
- 屏蔽產品的具體實現,調用者只關心產品的介面。
3.2 缺點
每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。
四、工廠模式實例
4.1 創建一個介面
Shape.java
1 public interface Shape { 2 void draw(); 3 }
4.2 創建實現介面的實體類
Rectangle.java
1 public class Rectangle implements Shape { 2 3 @Override 4 public void draw() { 5 System.out.println("Inside Rectangle::draw() method."); 6 } 7 }
Square.java
1 public class Square implements Shape { 2 3 @Override 4 public void draw() { 5 System.out.println("Inside Square::draw() method."); 6 } 7 }
Circle.java
1 public class Circle implements Shape { 2 3 @Override 4 public void draw() { 5 System.out.println("Inside Circle::draw() method."); 6 } 7 }
4.3 創建一個工廠,生成基於給定信息的實體類的對象。
ShapeFactory.java
1 public class ShapeFactory { 2 3 //使用 getShape 方法獲取形狀類型的對象 4 public Shape getShape(String shapeType){ 5 if(shapeType == null){ 6 return null; 7 } 8 if(shapeType.equalsIgnoreCase("CIRCLE")){ 9 return new Circle(); 10 } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 11 return new Rectangle(); 12 } else if(shapeType.equalsIgnoreCase("SQUARE")){ 13 return new Square(); 14 } 15 return null; 16 } 17 }
4.4 使用該工廠,通過傳遞類型信息來獲取實體類的對象。
FactoryPatternDemo.java
1 public class FactoryPatternDemo { 2 3 public static void main(String[] args) { 4 ShapeFactory shapeFactory = new ShapeFactory(); 5 6 //獲取 Circle 的對象,並調用它的 draw 方法 7 Shape shape1 = shapeFactory.getShape("CIRCLE"); 8 9 //調用 Circle 的 draw 方法 10 shape1.draw(); 11 12 //獲取 Rectangle 的對象,並調用它的 draw 方法 13 Shape shape2 = shapeFactory.getShape("RECTANGLE"); 14 15 //調用 Rectangle 的 draw 方法 16 shape2.draw(); 17 18 //獲取 Square 的對象,並調用它的 draw 方法 19 Shape shape3 = shapeFactory.getShape("SQUARE"); 20 21 //調用 Square 的 draw 方法 22 shape3.draw(); 23 } 24 }
4.3 驗證輸出。
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.