最近無意中看到一些對·單例模式·介紹的資料,有以下幾個疑問:很多資料說單例模式無法繼承, 我自己覺得不對, 單例模式完全可以將private設置為protected, 然后將self設置為static來實現繼承功能呀, 不知道說無法繼承的是哪個角度思考的, 所以有疑問?假設我的項目中有很多功能, 我的理解是 "用戶每操作一下, 都會產生一個進程, 或者是一個進程中制作一次請求--相應操作, 然后當前操作在服務器運行完成并返回響應, 則進程結束, 這樣的話, 假設你有個單例類是Log類, 用來記錄日志, 那么本次進程結束后, 進程中的單例自然也就被銷毀了, 另外一次操作的話, 這次操作會再次生成新的Log實例"所以單例應該是按一個個的進程為單位來討論的, 但是很多資料說 "如果實例化的對象長時間不被利用,系統會認為是垃圾而被回收,這將導致對象狀態的丟失。" 這怎么理解? 多長時間算是長?畢竟我的項目根據功能點的不同, 可能有些功能點復雜, 有些簡單, 我的Log實例要在每個功能中做日志記錄, 難道還得考慮功能運行過長的話.... 我的日志會丟失一部分?還有資料說:"濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出"數據庫連接池一般不就是個類似數組的容器么? 我第一次建立好數據庫連接之后, 將連接對象放入連接池中, 如果進程中再次需要連接數據庫的話, 直接從連接池中取出之前創建好的連接對象不就行了(而且我看比如TP3.2就是這么做的)所謂 "連接池溢出" 是什么意思, 難道是說本次進程中有 n 個 不同的數據庫連接, 導致連接池中存放數據對象過大導致的內存溢出?不應該吧, 如果連接池是數組, 能放不少數據的啊, 而什么業務能在一個進程中操作這么多不同的數據庫連接, 所以還是沒能理解TP3.2框架使用單例也是非完全套用 三私一公 來實現的, 比如ThinkDriverDb 只做到靜態化所有方法即可, 你即使new出來也沒用, 這樣是不是也沒什么槽點?
(PHP)單例模式 怎么蹦出好多問題, 煩請大家幫忙指點一二
慕碼人2483693
2018-08-04 14:23:19