簡單工廠模式

簡單工廠模式的動機

簡單工廠模式主要應用在簡歷大量功能相似的類時。比如在界面上,按鈕需要具有相同的畫風、外觀等等,但是具體的功能不一樣。也就是類型相似,但是功能不同(也就是通常擁有相同的父類)。如果使用普通的new對象來創建,將會出現大量的new對象。通常使用一個工廠類來進行創建具體的類。

模式定義

簡單工廠模式(Simple Factory Pattern):又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類

模式的結構

簡單工廠的角色

工廠模式的 UML 圖

代碼分析

  1. Shape.java
  2. public interface Shape {
  3. void draw();
  4. }
  5. Circle.Java
  6. public class Circle implements Shape {
  7. @Override
  8. public void draw() {
  9. System.out.println("i am a circle");
  10. }
  11. }
  12. Square.java
  13. public class Square implements Shape {
  14. @Override
  15. public void draw() {
  16. System.out.println("I am a Square");
  17. }
  18. }
  19. ShapeFactory.java
  20. public class ShapeFactory {
  21. public static Shape create(String shapeType){
  22. if (shapeType == "square"){
  23. return new Square();
  24. } else{
  25. return new Circle();
  26. }
  27. }
  28. public static void main(String[] args) {
  29. Shape shape = ShapeFactory.create("square");
  30. shape.draw();
  31. }
  32. }

簡單工廠模式的意義

  • 簡單工廠模式的本質仍然是根據傳入的值創建對象,通過不斷的if或者else if來判斷需要創建的對象
  • 簡單工廠模式最大的問題在於工廠類的職責相對過重,增加新的產品需要修改工廠類的判斷邏輯,這一點與開閉原則是相違背的。
  • 簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。
  • 簡單工廠將同一接口下的類進行統一創建,將創建與使用進行解耦,降低了組件之間的依賴性,對象的業務不依賴於他的對象而是依賴於工廠和統一的接口,工廠基於不同的對象進行調度,如果需要返回別的對象,可以只需要修改工廠類,而不需要找到所有的業務實現中的調用,使對象的創建更加靈活

簡單工廠的使用情景

  • 首先因爲簡單工廠需要不停的進行判斷,所以如果需要創建的類太多,工廠方法就會進行復雜的邏輯判斷或者長時間的進行匹配,程序運行效率較低
  • 需要對調用方隱藏創建方式

JDK中的應用實例

  • dateformat中使用了工廠方式進行創建

    1. Dateformat
    2. private static DateFormat get(int timeStyle, int dateStyle,
    3. int flags, Locale loc) {
    4. if ((flags & 1) != 0) {
    5. if (timeStyle < 0 || timeStyle > 3) {
    6. throw new IllegalArgumentException("Illegal time style " + timeStyle);
    7. }
    8. } else {
    9. timeStyle = -1;
    10. }
    11. if ((flags & 2) != 0) {
    12. if (dateStyle < 0 || dateStyle > 3) {
    13. throw new IllegalArgumentException("Illegal date style " + dateStyle);
    14. }
    15. } else {
    16. dateStyle = -1;
    17. }
    18. LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, loc);
    19. DateFormat dateFormat = get(adapter, timeStyle, dateStyle, loc);
    20. if (dateFormat == null) {
    21. dateFormat = get(LocaleProviderAdapter.forJRE(), timeStyle, dateStyle, loc);
    22. }
    23. return dateFormat;
    24. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章