工作中最常用的8種設計模式

👉 這是一個或許對你有用的社群
🐱 一對一交流/面試小冊/簡歷最佳化/求職解惑,歡迎加入芋道快速開發平臺知識星球。下面是星球提供的部分資料:
👉這是一個或許對你有用的開源專案
國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。
功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、ERPCRMAI 大模型等等功能:
  • Boot 多模組架構:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 微服務架構:https://gitee.com/zhijiantianya/yudao-cloud
  • 影片教程:https://doc.iocoder.cn
【國內首批】支援 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 雙版本 

前言

設計模式在我們日常的軟體開發中無處不在,它們幫助我們編寫更易擴充套件、更具可讀性的程式碼。
今天結合我實際工作場景和原始碼例項,跟大家一起聊聊工作中最常用的8種設計模式,希望對你會有所幫助。
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 影片教程:https://doc.iocoder.cn/video/

1. 單例模式

單例模式確保一個類只有一個例項,通常用於管理共享資源,如配置、快取、執行緒池等。
程式碼實現:雙重檢查鎖這是單例模式的標準寫法,既保證執行緒安全,又避免效能損耗。
publicclassSingleton

{

privatestaticvolatile

 Singleton instance;

privateSingleton()

{}

publicstatic Singleton getInstance()

{

if

 (instance == 

null

) {

synchronized

 (Singleton

.class

{

if

 (instance == 

null

) {

                    instance = 

new

 Singleton();

                }

            }

        }

return

 instance;

    }

}

JDK 中的應用:
  • java.lang.Runtime.getRuntime()
  • java.util.logging.Logger
Spring 中的應用:Spring 的 Bean 預設是單例模式。可以透過 @Scope("prototype") 將其改為多例。
基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/yudao-cloud
  • 影片教程:https://doc.iocoder.cn/video/

2. 工廠模式

工廠模式用於封裝物件的建立邏輯,特別是當類例項化過程複雜時,可以降低耦合度。
程式碼實現:簡單工廠以支付系統為例,不同支付方式需要不同的物件。
publicclassPaymentFactory

{

publicstatic Payment createPayment(String type)

{

switch

 (type) {

case"AliPay"

:

returnnew

 AliPay();

case"WeChatPay"

:

returnnew

 WeChatPay();

default

:

thrownew

 IllegalArgumentException(

"Unknown payment type"

);

        }

    }

}

JDK 中的應用:
  • java.util.Calendar.getInstance()
  • javax.xml.parsers.DocumentBuilderFactory.newInstance()
Spring 中的應用:
  • BeanFactoryApplicationContext 都是工廠模式的體現。

3. 策略模式

策略模式將不同演算法封裝為獨立類,並允許在執行時選擇不同的策略。
程式碼實現:促銷策略以電商促銷為例,支援滿減、打折等多種策略。
publicinterfacePromotionStrategy

{

voidapplyPromotion()

;

}

publicclassDiscountStrategyimplementsPromotionStrategy

{

@Override
publicvoidapplyPromotion()

{

        System.out.println(

"Applying discount..."

);

    }

}

publicclassPromotionContext

{

private

 PromotionStrategy strategy;

publicPromotionContext(PromotionStrategy strategy)

{

this

.strategy = strategy;

    }

publicvoidexecutePromotion()

{

        strategy.applyPromotion();

    }

}

JDK 中的應用:
  • java.util.Comparator 是典型的策略模式。
Spring 中的應用:
  • 事務管理(TransactionManager),支援程式設計式和宣告式事務。

4. 代理模式

代理模式透過代理物件控制對目標物件的訪問,常用於許可權控制、日誌記錄等場景。
程式碼實現:靜態代理模擬對一個服務的許可權控制。
publicinterfaceService

{

voidexecute()

;

}

publicclassRealServiceimplementsService

{

@Override
publicvoidexecute()

{

        System.out.println(

"Executing real service..."

);

    }

}

publicclassServiceProxyimplementsService

{

private

 RealService realService;

@Override
publicvoidexecute()

{

        System.out.println(

"Checking permissions..."

);

if

 (realService == 

null

) {

            realService = 

new

 RealService();

        }

        realService.execute();

    }

}

JDK 中的應用:
  • 動態代理 java.lang.reflect.Proxy
  • RMI(遠端方法呼叫)
Spring 中的應用:
  • AOP(面向切面程式設計)廣泛使用代理模式。

5. 觀察者模式

觀察者模式定義一對多的依賴,當一個物件狀態變化時,所有依賴它的物件都會收到通知。
程式碼實現:事件通知模擬微博使用者的粉絲通知。
publicinterfaceObserver

{

voidupdate(String message)

;

}

publicclassUserimplementsObserver

{

private

 String name;

publicUser(String name)

{

this

.name = name;

    }

@Override
publicvoidupdate(String message)

{

        System.out.println(name + 

" received message: "

 + message);

    }

}

publicclassWeibo

{

private

 List<Observer> observers = 

new

 ArrayList<>();

publicvoidfollow(Observer observer)

{

        observers.add(observer);

    }

publicvoidpost(String message)

{

for

 (Observer observer : observers) {

            observer.update(message);

        }

    }

}

JDK 中的應用:
  • java.util.Observerjava.util.Observable
  • javax.swing.event.ChangeListener
Spring 中的應用:
  • ApplicationEventApplicationListener 是典型實現。

6. 裝飾器模式

裝飾器模式在不改變原始類的基礎上,動態擴充套件其功能。
程式碼實現:咖啡加料模擬一個咖啡訂單系統,可以動態加料。
publicinterfaceCoffee

{

String getDescription()

;

doublegetCost()

;

}

publicclassSimpleCoffeeimplementsCoffee

{

@Override
public String getDescription()

{

return"Simple Coffee"

;

    }

@Override
publicdoublegetCost()

{

return5.0

;

    }

}

publicclassMilkDecoratorimplementsCoffee

{

private

 Coffee coffee;

publicMilkDecorator(Coffee coffee)

{

this

.coffee = coffee;

    }

@Override
public String getDescription()

{

return

 coffee.getDescription() + 

", Milk"

;

    }

@Override
publicdoublegetCost()

{

return

 coffee.getCost() + 

1.5

;

    }

}

JDK 中的應用:
  • java.io.BufferedInputStreamjava.io.BufferedOutputStream
Spring 中的應用:
  • BeanPostProcessor 用於動態修改 Bean 的行為。

7. 模板方法模式

模板方法模式定義一個演算法的骨架,把具體的實現留給子類。
程式碼實現:任務執行模板模擬定時任務的執行流程。
publicabstractclassTask

{

publicfinalvoidexecute()

{

        init();

        doWork();

        cleanup();

    }

protectedabstractvoidinit()

;

protectedabstractvoiddoWork()

;

protectedvoidcleanup()

{

        System.out.println(

"Default cleanup..."

);

    }

}

publicclassDataProcessingTaskextendsTask

{

@Override
protectedvoidinit()

{

        System.out.println(

"Initializing data..."

);

    }

@Override
protectedvoiddoWork()

{

        System.out.println(

"Processing data..."

);

    }

}

JDK 中的應用:
  • java.util.AbstractListjava.util.AbstractMap
Spring 中的應用:
  • JdbcTemplateRestTemplate

8. 建造者模式

建造者模式用於建立複雜物件,特別是當物件有多個可選引數時。
程式碼實現:構建 HTTP 請求
publicclassHttpRequest

{

private

 String method;

private

 String url;

private

 String body;

privateHttpRequest(Builder builder)

{

this

.method = builder.method;

this

.url = builder.url;

this

.body = builder.body;

    }

publicstaticclassBuilder

{

private

 String method;

private

 String url;

private

 String body;

public Builder method(String method)

{

this

.method = method;

returnthis

;

        }

public Builder url(String url)

{

this

.url = url;

returnthis

;

        }

public Builder body(String body)

{

this

.body = body;

returnthis

;

        }

public HttpRequest build()

{

returnnew

 HttpRequest(

this

);

        }

    }

}

JDK 中的應用:
  • StringBuilder
  • Stream.Builder
Spring 中的應用:
  • UriComponentsBuilder 用於構建 URI。

總結

這些設計模式不僅在日常開發中有著廣泛應用,更在 JDK 和 Spring 中深度體現。
瞭解它們的本質和應用場景,能夠讓我們寫出更優雅、更健壯的程式碼。
下次再遇到類似問題時,希望你能得心應手地選擇合適的模式!

歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,長按”或“掃描”下方二維碼噢
星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。
文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)

相關文章