免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

C++工廠方法模式深度解析:從分支重構(gòu)到智能指針實踐

C++工廠方法模式深度解析:從分支重構(gòu)到智能指針實踐 寫這篇的時候其實我猶豫了一下要不要再寫設(shè)計模式。市面上講工廠模式的文章一抓一大把從GOF的經(jīng)典定義到各種C重造輪子的博客實在不算新鮮。但我在實際項目里審了幾年代碼發(fā)現(xiàn)一個挺有意思的現(xiàn)象真正把工廠方法用對、用到位的人不多大多數(shù)人只是背了個概念甚至把簡單工廠和工廠方法混為一談。很多人一上來就在基類構(gòu)造函數(shù)里調(diào)虛函數(shù)——這是C特有的坑后面我會專門講。所以這篇不打算從頭抄一遍GOF的UML圖而是想從“你在代碼里感受到了什么痛點自然而然走到這個模式門前”的角度來聊。先說明白這個模式到底解決了哪類問題再手把手帶著把代碼寫出來然后講幾個很容易踩碎的細節(jié)最后聊聊現(xiàn)在C新標準下這個經(jīng)典模式有什么新的表達方式。1. 判定需求膨脹的代碼壞味道switch-case和if-else的重災(zāi)區(qū)很多模式不是“設(shè)計”出來的是被逼出來的。工廠方法最典型的出現(xiàn)場景是代碼里開始出現(xiàn)大量根據(jù)類型標記分支的邏輯而且這些邏輯還在不斷增長。1.1 一個很現(xiàn)實的例子模擬對象創(chuàng)建器假設(shè)你在寫一個性能分析工具需要把各個監(jiān)控指標對應(yīng)的模擬對象創(chuàng)建出來。一開始只有CPU和內(nèi)存兩個指標代碼很清爽// 粗暴但清晰的第一版 std::shared_ptrSimObject CreateSimulator(const std::string type) { if (type CPU) { return std::make_sharedCpuSimulator(); } if (type MEM) { return std::make_sharedMemSimulator(); } return nullptr; }加個判斷多簡單但是項目永遠是活的。第二周加了磁盤IO第三周加了網(wǎng)絡(luò)流量第四周銷售那邊提了個新需求說模擬場景里要包含一組容器化的指標對象。于是函數(shù)開始變長if (type DISK) { ... } if (type NET) { ... } if (type CONTAINER) { return std::make_sharedContainerGroupSimulator(); }每個新增的類型都會讓這個函數(shù)多兩三行。看著還行但問題不在于這個函數(shù)本身而在于使用這個創(chuàng)建函數(shù)的每個地方幾乎也都有一套對應(yīng)的分支邏輯。比如初始化模擬對象參數(shù)的地方if (type CPU) { params.SetCpuQuota(...); } else if (type MEM) { params.SetMemLimit(...); }配置加載的地方再判斷一次if (type CPU) { config.RegisterMetric(cycles); } else if (type DISK) { config.RegisterMetric(io_wait); }你發(fā)現(xiàn)沒有創(chuàng)建邏輯和類型分支像癌細胞一樣擴散到了調(diào)用方的各個環(huán)節(jié)。每次新增一個模擬對象不是改一處而是到處打補丁。這時候你會產(chǎn)生一種典型的“代碼壞味”感受我什么都沒干我只是想加點功能為什么要把以前寫的東西全都翻出來改一遍這就是需求膨脹到一定階段后很典型的“開放-封閉原則”失效場景。所謂面向修改開放、面向擴展封閉在最初的簡單代碼里只是一個美好愿望而分支點在不斷累積的時候就是該考慮系統(tǒng)收斂一下對象創(chuàng)建這件事了。1.2 層層疊疊的分支邏輯為什么讓大家痛苦再往深了說這套分支邏輯真正讓人難受的點有三個一是邏輯重復。每個調(diào)用點都要判斷類型標記同樣的判斷字符串散落在各處一旦命名規(guī)范變了比如把“MEM”改為“MEMORY”你得全局搜索替換稍不留神就有遺漏。二是耦合點太密。模塊A在創(chuàng)建對象模塊B在用對象模塊C在配置對象一旦鏈條底層的模擬對象構(gòu)造簽名改了所有分支里的調(diào)用代碼都要跟著改。三是測試成本高。想單測一個新增的模擬對象你得先把主分支函數(shù)跑起來但主分支函數(shù)本身就承擔了所有類型的分發(fā)根本沒法單獨測。而且一旦設(shè)計出多處分支結(jié)構(gòu)你還會發(fā)現(xiàn)一個更麻煩的事分支之外的公共流程被夾碎了。比如每個模擬對象創(chuàng)建完都要經(jīng)過初始化、綁定數(shù)據(jù)源、注冊到管理器這套“公共骨架”被散落在分支之間難以抽取復用。感性的描述說了這么多其實核心已經(jīng)浮出來了我們真正想做的就是讓每類對象知道自己該怎么被創(chuàng)建并且在新增類型時不再回頭修改舊代碼。2. 工廠方法模式的核心本質(zhì)推遲實例化到子類好了上面這些痛點如果你也經(jīng)歷過那你其實已經(jīng)準備好理解這個模式了。工廠方法模式不是一組稀奇古怪的類名堆砌它的本質(zhì)只有一句話定義一個創(chuàng)建對象的接口讓子類決定實例化哪一個類。2.1 把“創(chuàng)建一個對象”也當成一門產(chǎn)品來做先看兩個最核心的概念Product產(chǎn)品和 Creator創(chuàng)建者。Product是“產(chǎn)品”的統(tǒng)稱在實際代碼里就是那個所有具體對象都要實現(xiàn)的抽象基類或協(xié)議接口。Creator是“創(chuàng)建者”它本身并不關(guān)心你到底要生產(chǎn)哪個具體產(chǎn)品它只定義了創(chuàng)建產(chǎn)品時需要的那幾步公共骨架其中有一部關(guān)鍵動作是“請求一個產(chǎn)品實例”這個關(guān)鍵動作就叫工廠方法Factory Method。粗看會覺得它很簡單因為GOF原書里給的類圖看起來就是兩個層級——一個Product層級一個Creator層級。但真正值得琢磨的是C實現(xiàn)里那個“生產(chǎn)得到的到底是啥”的問題因為工廠方法返回類型恰恰是C里看上去簡單、卻很容易搞錯重點的地方。2.2 C中為什么基類指針/引用至關(guān)重要在C里談工廠方法有一個必須首先牢固建立的概念工廠方法返回的必須是一個抽象類型基類指針或引用而絕不能是具體類型。這不是什么風格偏好而是C的靜態(tài)類型系統(tǒng)所決定的。比如方法簽名寫著std::shared_ptrSimObject Create(const std::string type)里面的SimObject就是咱們的抽象基類。這樣子類覆蓋工廠方法時返回的才可能是CpuSimulator、MemSimulator這樣的具體產(chǎn)品。調(diào)用方只和基類接口打交道具體類型在編譯期被“抹掉”了這就是多態(tài)在創(chuàng)建層面的體現(xiàn)。反過來想如果工廠方法直接返回具體類型比如CpuSimulator*那你創(chuàng)建函數(shù)就得為每個具體類型寫一個重載調(diào)用方的分支判斷還會變成編譯期的類型選擇一套組合拳下來代碼反而比一開始更擰巴。所以記住一個C特有結(jié)論工廠方法模式的前提是能在運行時拿到基類指針而用它去調(diào)用虛函數(shù)時調(diào)用的是具體型號的方法。不在這個前提下談工廠方法等于建了一棟沒有承重墻的房子。3. 手寫一套工廠方法的完整骨架一個C示例的逐步推導光講概念沒有用這里咱們直接從一個“波形生成器”的示例開始完整過一遍代碼的演進。之所以用波形生成器是因為它足夠簡單又能體現(xiàn)“不同產(chǎn)品不同參數(shù)”的特點非常適合做案例。3.1 從Product到Creator的代碼推導先定義產(chǎn)品抽象。#include memory #include string #include vector // 產(chǎn)品基類所有波形生成器都遵循這個接口 class WaveGenerator { public: virtual ~WaveGenerator() default; // 每種波形生成器都會生成自己的采樣點序列 virtual std::vectordouble Generate(int sampleCount) const 0; // 每種波形都有自己的標識名方便調(diào)試和序列化 virtual std::string GetName() const 0; };然后是幾個具體產(chǎn)品class SineWaveGenerator final : public WaveGenerator { public: std::vectordouble Generate(int sampleCount) const override { std::vectordouble data; data.reserve(sampleCount); for (int i 0; i sampleCount; i) { data.push_back(std::sin(2.0 * 3.141592653589793 * i / sampleCount)); } return data; } std::string GetName() const override { return sine; } }; class SquareWaveGenerator final : public WaveGenerator { public: std::vectordouble Generate(int sampleCount) const override { std::vectordouble data; data.reserve(sampleCount); for (int i 0; i sampleCount; i) { double t static_castdouble(i) / sampleCount; data.push_back(t 0.5 ? 1.0 : -1.0); } return data; } std::string GetName() const override { return square; } };好現(xiàn)在產(chǎn)品有了。接下來定義Creator。注意這里的關(guān)鍵是Creator不是負責具體分發(fā)的那一個它只負責提供一個可以覆蓋的“生產(chǎn)入口”class WaveFactory { public: virtual ~WaveFactory() default; // 工廠方法子類決定返回哪種具體產(chǎn)品 virtual std::unique_ptrWaveGenerator CreateWave() const 0; // 一個使用了工廠方法的公共流程 // 不管子類生產(chǎn)的是正弦波還是方波公共流程都是一樣的 void GenerateAndPrint(int sampleCount) const { auto wave CreateWave(); auto samples wave-Generate(sampleCount); std::cout Generated wave-GetName() with samples.size() samples: std::endl; for (double v : samples) { std::cout v ; } std::cout std::endl; } };然后在具體工廠里各自決定自己生產(chǎn)什么class SineWaveFactory final : public WaveFactory { public: std::unique_ptrWaveGenerator CreateWave() const override { return std::make_uniqueSineWaveGenerator(); } }; class SquareWaveFactory final : public WaveFactory { public: std::unique_ptrWaveGenerator CreateWave() const override { return std::make_uniqueSquareWaveGenerator(); } };到這一步我估計有經(jīng)驗的開發(fā)者已經(jīng)發(fā)現(xiàn)了這個“工廠”和常見的“把type字符串丟進去返回對應(yīng)對象”的那種寫法不太一樣。它沒有if分支甚至沒有一個集中式的分發(fā)邏輯。是的這就是工廠方法模式和簡單工廠的核心差別返回什么東西這件事被下放到了子類里而不是保留在一個集中函數(shù)里。3.2 調(diào)用方式與動態(tài)類型識別的小技巧調(diào)用方式倒是很簡單int main() { SineWaveFactory sineFactory; sineFactory.GenerateAndPrint(16); SquareWaveFactory squareFactory; squareFactory.GenerateAndPrint(16); }這個輸出會展示正弦波和方波各自的采樣數(shù)據(jù)。很多初學C的同學會糾結(jié)一個問題CreateWave返回的是unique_ptrWaveGenerator那我怎么知道它底層到底是一個正弦波還是方波這個問題得分兩說。如果產(chǎn)品接口設(shè)計得足夠完善調(diào)用方壓根不需要關(guān)心具體類型只需要對著基類接口操作。如果你真的有必要知道具體類型——比如要下發(fā)給不同處理鏈路的模塊——那么應(yīng)當走到工廠方法之外去思考設(shè)計問題產(chǎn)品的職責邊界是不是沒劃分干凈是否所有波形生成器都真的適合跑在同一個抽象下這種情況通常意味著接口里缺少一個能區(qū)分行為差異的虛函數(shù)。還有一個細節(jié)在工廠方法里返回unique_ptr和返回shared_ptr其實是兩種不同的語義選擇。前者表示創(chuàng)建者并不共享對象所有權(quán)誰調(diào)用誰獨占后者表示這個產(chǎn)物可能被多個持有者同時引用。實際項目里如果產(chǎn)品的生命周期和調(diào)用方深度綁定unique_ptr更合適因為可以避免無謂的引用計數(shù)開銷如果產(chǎn)品將來會被多個模塊共享shared_ptr才是合理選擇。3.3 關(guān)鍵“為什么”公共流程代碼如何復用現(xiàn)在再回頭看WaveFactory::GenerateAndPrint你會發(fā)現(xiàn)它其實是個模版方法Template Method的影子。工廠方法模式通常和模版方法配合使用——基類定義完整流程把其中一個步驟創(chuàng)建產(chǎn)品延遲到子類實現(xiàn)。這樣每個子類雖然工廠方法內(nèi)容不同但上層流程完全一致。很多人忽略了這個配合關(guān)系只盯著工廠方法本身導致寫出來的代碼仍然是“每個子類重復一套公共流程”。而 C 里復用公共流程最自然的方式就是把這個流程放在基類非虛函數(shù)中需要變化的那一步調(diào)用純虛函數(shù)。這個組合設(shè)計能讓代碼的復用程度顯著提升也是我想強調(diào)的一個比較實用的技巧。4. 怎么比“C默認行為”多做一步返回類型拷貝問題的避坑手冊這部分是C里最容易把人繞暈的地方我單獨拿出來展開說。因為工廠方法涉及返回一個對象而這個對象需要穿過函數(shù)返回值這道“邊界”。4.1 為什么基類返回類型不能直接返回具體對象如果直接寫WaveGenerator CreateWave() const; // 錯那你的產(chǎn)品對象在返回的瞬間就會被切片slicing。所謂切片就是子類對象按基類類型的值返回時編譯器會構(gòu)造一個WaveGenerator臨時對象而子類部分的數(shù)據(jù)被丟棄。這在靜態(tài)類型語言里是很容易犯的低級錯誤尤其對于從Java轉(zhuǎn)C的開發(fā)者來說因為Java里一切引用本質(zhì)上都是指針語義不會有這種問題。C的正確做法前面已經(jīng)寫過了返回指針或引用。引用返回有個生命周期風險工廠方法一般返回本地的局部對象如果返回引用就會變成一個懸空引用。所以現(xiàn)代C里最安全的默認選擇就是返回unique_ptr或者shared_ptr。4.2 基類必須聲明虛析構(gòu)函數(shù)原因和解決辦法這個其實是老生常談但它在工廠方法里有個特別致命的場景值得單獨強調(diào)。想想看你從工廠方法里拿到了一個unique_ptrWaveGenerator底層實際是SineWaveGenerator。在銷毀這個對象時unique_ptrWaveGenerator的析構(gòu)函數(shù)會調(diào)用WaveGenerator的析構(gòu)函數(shù)。如果WaveGenerator的析構(gòu)函數(shù)不是虛函數(shù)那它就不會再去調(diào)用SineWaveGenerator的析構(gòu)函數(shù)于是子類里持有的資源可能不會被釋放。在波形生成器這種簡單場景里可能問題不大但如果子類持有文件句柄、網(wǎng)絡(luò)連接或者自己分配的大塊緩沖這個問題就立刻變成內(nèi)存泄漏。解決辦法也很簡單在產(chǎn)品基類的析構(gòu)函數(shù)前面加個virtualvirtual ~WaveGenerator() default;一定要記住沒有虛析構(gòu)函數(shù)的基類就不能被作為工廠方法的返回類型來用。這不是風格問題是安全底線。4.3 構(gòu)造函數(shù)里調(diào)用工廠方法C虛調(diào)用的致命坑這里插一個我在真實代碼評審里見過的經(jīng)典錯誤。有一位同事在一個模擬器框架里把工廠方法的調(diào)用放在基類的構(gòu)造函數(shù)里期望在構(gòu)造基類時就能動態(tài)創(chuàng)建出具體的產(chǎn)品。結(jié)果程序運行后產(chǎn)品永遠是一個“空殼”類型的實例。這個問題的根因在C的構(gòu)造順序里在基類構(gòu)造函數(shù)執(zhí)行期間虛函數(shù)表指向的仍然是基類的虛函數(shù)版本。也就是說C的虛函數(shù)多態(tài)機制在構(gòu)造期間還沒有完全生效。你在構(gòu)造函數(shù)里調(diào)用CreateWave()即使它被聲明為虛函數(shù)當前調(diào)用的仍然只會是WaveFactory::CreateWave()—— 而基類里那個純虛函數(shù)根本沒法被調(diào)用能編譯運行純粹是因為某些寫法兜住了但行為完全不對。正確做法是不要在構(gòu)造函數(shù)里調(diào)用虛函數(shù)。把創(chuàng)建動作移動到獨立的方法里讓它在對象完全構(gòu)造成功后再被觸發(fā)。這也是工廠方法存在于“創(chuàng)建對象”這個語境下的一個側(cè)面提醒——它適合在產(chǎn)品對象已經(jīng)被完整構(gòu)造之后對某個接口發(fā)起“生產(chǎn)”請求而不是在構(gòu)造過程中自找麻煩。5. 三種容易混淆的工廠形態(tài)簡單工廠、工廠方法、抽象工廠的實際選擇很多人把“工廠”這個詞當作一個萬能藥遇到創(chuàng)建邏輯有點復雜就往工廠里套。其實光C社區(qū)里就至少流傳著三種不一樣工廠形態(tài)把它們區(qū)分清楚在做設(shè)計決策時會有幫助。5.1 三個形態(tài)的本質(zhì)對比先看簡單工廠它的特征是有一個集中的CreateXxx靜態(tài)函數(shù)接收一個參數(shù)然后根據(jù)參數(shù)開關(guān)分發(fā)到不同的具體構(gòu)造函數(shù)。這個不算GOF里的經(jīng)典模式而是一種編碼慣例但它最常見幾乎所有做C的人都會先寫這個。再看工廠方法就是前面一直在講的它把創(chuàng)建動作定義在基類里具體生產(chǎn)交給子類。最后是抽象工廠它不是一兩個類而是一整套產(chǎn)品族創(chuàng)建接口。比如圖形界面庫里你有一個“Windows風格工廠”能同時創(chuàng)建按鈕、文本框、滾動條還有一個“Linux風格工廠”也創(chuàng)建同簽名的三個控件只是每個控件的實現(xiàn)完全不同。這里的核心是產(chǎn)品族之間的配套一致性。它們?nèi)叩年P(guān)系我習慣用一個表格來總結(jié)形態(tài)創(chuàng)建入口核心特點適用場景簡單工廠集中式靜態(tài)函數(shù)靠條件分支創(chuàng)建產(chǎn)品擴展需改原函數(shù)產(chǎn)品類型少、變化不頻繁的小項目工廠方法基類虛函數(shù)子類實現(xiàn)每個子類決定自己的產(chǎn)品符合封閉/開放原則產(chǎn)品種類會持續(xù)擴展創(chuàng)建流程相對統(tǒng)一抽象工廠一組創(chuàng)建接口按產(chǎn)品族實現(xiàn)保證產(chǎn)品族內(nèi)部一致性復雜度和靈活度都高多套風格/系列的產(chǎn)品同時存在啟動時選一整套5.2 實際項目里如何選擇別為設(shè)計而設(shè)計我的經(jīng)驗是不要一上來就抽象工廠大部分項目用到工廠方法就夠了。如果一個系統(tǒng)只需要支持兩三種固定的產(chǎn)品類型簡單工廠反而更直接——你不需要建立那么多繼承關(guān)系也不需要一個虛函數(shù)表跳來跳去。但一旦你預(yù)見到“產(chǎn)品類型每周都可能增加一類”而且每一類的創(chuàng)建方式都有其特殊性那簡單工廠的分支就會開始膨脹。這時切換到工廠方法新增類型只需要新增一個產(chǎn)品類和對應(yīng)的工廠子類老代碼一行不動。另外的一個參考指標是看創(chuàng)建流程的骨架是否穩(wěn)定。如果創(chuàng)建一個對象總是要經(jīng)過“解析配置—構(gòu)造內(nèi)部組件—綁定外部依賴—注冊回調(diào)”這幾步而具體每一步各家不同那么工廠方法配合模版方法結(jié)構(gòu)就非常合適。如果連流程骨架本身都不穩(wěn)定每個產(chǎn)品類型的生命周期和管理方式都大相徑庭那再用工廠硬套只會讓代碼更擰巴——這時候可以直接在更高層級用一個注冊表 委托函數(shù)的路子了。6. C工程里的實際擴展注冊表工廠和lambda工廠傳統(tǒng)工廠方法模式是依賴繼承來解決問題的但在現(xiàn)代C里工程上還有兩種很常見的變體注冊表工廠和lambda工廠。它們不是設(shè)計模式的新概念而是利用語言特性對工廠方法模式的適配。6.1 注冊表工廠用映射表替代一大堆子類如果你有幾十種產(chǎn)品為每一個產(chǎn)品都寫一個工廠子類會顯得特別冗余。這時用一個注冊表把字符串和std::function映射起來能讓代碼干凈得多#include functional #include unordered_map class WaveRegistry { public: using FactoryFn std::functionstd::unique_ptrWaveGenerator(); void Register(const std::string name, FactoryFn fn) { factories_[name] std::move(fn); } std::unique_ptrWaveGenerator Create(const std::string name) const { auto it factories_.find(name); if (it factories_.end()) { return nullptr; } return it-second(); } private: std::unordered_mapstd::string, FactoryFn factories_; };然后你就可以在某個模塊初始化時把具體創(chuàng)建函數(shù)注冊進去WaveRegistry registry; registry.Register(sine, []() - std::unique_ptrWaveGenerator { return std::make_uniqueSineWaveGenerator(); }); registry.Register(square, []() - std::unique_ptrWaveGenerator { return std::make_uniqueSquareWaveGenerator(); });調(diào)用側(cè)只需要知道名稱完全不接觸任何具體工廠類。這種方式對插件化、動態(tài)加載特別友好因為每個插件只需要把自己支持的類型注冊進去就行不需要改主程序里的任何分發(fā)邏輯。在實際工程里這是我在處理“產(chǎn)品類型非常多”時最常用的方式。6.2 lambda工廠的簡潔邊界還有一種更輕量的用法就是干脆不建工廠類直接在需要創(chuàng)建產(chǎn)品的地方用lambda寫一個創(chuàng)建函數(shù)。這個方式適合那種“只在一個地方創(chuàng)建、其他地方不關(guān)心”的場景——比如某個服務(wù)內(nèi)部構(gòu)建自己的依賴組件時直接寫個lambda作為默認工廠即可。lambda工廠的邊界在于它不適合“工廠本身需要復用”的場景也不適合產(chǎn)品創(chuàng)建流程較長、需要子類共享骨架的場景。如果創(chuàng)建邏輯只有兩三行而且不會在第二處復用我支持你用lambda一旦創(chuàng)建過程超過十行或者你發(fā)現(xiàn)這個lambda要在三個以上地方被調(diào)用那就該冷靜下來把它升格為真正的類或注冊表條目。7. 現(xiàn)代C語境下的工廠方法演進智能指針與移動語義的配合C已經(jīng)從裸指針時代走過來了工廠方法模式也搭上了新特性的快車。最明顯的變化是返回值的所有權(quán)語義被大大強化。7.1 從裸指針到unique_ptr/shared_ptr的變遷老式的C工廠方法通常返回一個裸指針注釋里寫著“調(diào)用者負責delete”。這套約定在現(xiàn)代C里已經(jīng)基本被淘汰原因很簡單所有權(quán)不明確容易漏刪也難以表達是獨占還是共享?,F(xiàn)在的主流寫法是以std::unique_ptr或std::shared_ptr作為返回類型。unique_ptr表示明確的獨占所有權(quán)移動語義讓返回值在函數(shù)間傳遞幾乎零開銷shared_ptr則適用于產(chǎn)品會被多個模塊共享的場景。一個小貼士在C14/17里如果產(chǎn)品類型繼承自enable_shared_from_this那么建議直接用shared_ptr作為工廠返回類型否則后續(xù)再轉(zhuǎn)成shared_ptr時容易遇到所有權(quán)割裂的問題。7.2 移動語義和完美轉(zhuǎn)發(fā)對工廠方法的影響移動語義讓工廠方法里構(gòu)造產(chǎn)品對象的開銷進一步下降。比如產(chǎn)品內(nèi)部持有很大的緩沖區(qū)C11之前可能需要拷貝整個緩沖區(qū)現(xiàn)在直接移動即可std::unique_ptrBufferGenerator CreateBufferGenerator(std::vectordouble data) { auto gen std::make_uniqueBufferGenerator(); gen-SetData(std::move(data)); // 不再拷貝 return gen; }完美轉(zhuǎn)發(fā)則讓工廠方法可以接受任意參數(shù)并原樣轉(zhuǎn)發(fā)給構(gòu)造函數(shù)。這在有些復雜產(chǎn)品初始化時很方便template typename... Args std::unique_ptrWaveGenerator CreateWrapped(Args... args) { return std::make_uniqueSineWaveGenerator(std::forwardArgs(args)...); }但要留意一下編譯器的模板理解和報錯信息C模板報錯自古就繞。對這種代碼重要建議是給工廠方法加上概念約束(concepts)或至少在注釋里寫清楚參數(shù)含義否則三個月后你自己都會忘記這些Args該怎么傳。7.3 C20/23的新工具讓工廠方法更健壯在C20和C23里我比較關(guān)注兩個特性在工廠方法上的應(yīng)用。一個是concepts可以用它來約束產(chǎn)品類型必須繼承自WaveGenerator在編譯期就攔截不匹配的類型template DerivedFromWaveGenerator T std::unique_ptrWaveGenerator CreateAsWave() { return std::make_uniqueT(); }另一個是std::expected或std::optional它們讓工廠方法的“創(chuàng)建失敗”語義更清晰。比如注冊表工廠里找不到對應(yīng)類型時以前返回nullptr調(diào)用方還得判空現(xiàn)在可以把錯誤原因一道返回。雖然會增加一點模板復雜度但對大型項目頗有幫助。8. 測試與調(diào)試心得工廠方法在實踐里的隱藏價值最后這部分說說工廠方法給測試和調(diào)試帶來的便利以及在真實項目中它的另一個“隱形好處”。8.1 便于單元測試的依賴注入點如果你的所有模擬對象都通過工廠方法創(chuàng)建那么在測試時你可以輕易地替換掉整個產(chǎn)品子樹。比如你要測GenerateAndPrint這個公共流程不需要真的創(chuàng)建正弦波只要用一個測試專用的假工廠讓它返回一個記錄型的假產(chǎn)品就足夠了。生產(chǎn)代碼和測試代碼之間通過工廠接口對接耦合度控制得很好。這也解釋了為什么很多優(yōu)秀的C測試框架里mock對象幾乎都依賴工廠或抽象接口——因為只有基于接口編程才能在運行時替換依賴。8.2 一個調(diào)試排錯的具體案例詭異的產(chǎn)品類型錯亂有一次我在調(diào)試一套渲染引擎發(fā)現(xiàn)場景中的某個物體偶爾會表現(xiàn)出完全不屬于自己類型的渲染行為。排查了很久最后定位到是工廠方法里返回了錯誤的類型轉(zhuǎn)換。當時的代碼類似于return std::make_sharedSomeDerived(...);但由于基類的工廠方法簽名是返回基類類型而子類的工廠方法里寫了一塊不正確的類型轉(zhuǎn)換邏輯導致運行時拿到的是一個類型不匹配的實例。這類問題如果不用工廠模式而直接在各調(diào)用方創(chuàng)建對象往往會被埋得更深。工廠方法把“創(chuàng)建”這一層面統(tǒng)一收口后定位起來反而容易很多。8.3 工廠方法模式給你帶來的全局視角我自己覺得工廠方法模式真正的價值在于它強迫你把“創(chuàng)建”這件事當成一個完整的、可擴展的關(guān)卡。每一個產(chǎn)品不再是散落在系統(tǒng)各處的new或者make_unique而是有明確入口、有明確職責、有明確測試點的組件。這會讓整個系統(tǒng)的結(jié)構(gòu)邊界清晰起來——無論你是自己維護一個中等規(guī)模的項目還是在團隊里協(xié)作這種邊界感對降低維護成本的作用遠超模式本身。9. 最后再分享一個經(jīng)驗從簡單工廠到工廠方法的平滑重構(gòu)路徑如果你現(xiàn)在的代碼還是一個簡單的集中式CreateByType函數(shù)別急著推倒重來平滑重構(gòu)路徑很關(guān)鍵。第一步先把創(chuàng)建入口修正為返回std::unique_ptrWaveGenerator而不是裸指針——這是所有權(quán)語義的明確化。第二步把函數(shù)改造成基類的虛函數(shù)讓每個分支對應(yīng)一個子類。這一步不需要一次做完可以先讓最常用的幾個類型走子類路線其他類型仍保留在基類里做兜底。第三步逐步把“按類型分發(fā)”的邏輯從調(diào)用方中移除讓所有調(diào)用方只看基類接口不再關(guān)心具體類型。最后再考慮是否引入注冊表或lambda工廠判斷標準是子類數(shù)量是否多到了寫起來很累的程度。這樣重構(gòu)的好處是每一步都是可編譯、可測試的不會出現(xiàn)推倒重來的大跨度失敗。我一直覺得設(shè)計模式不是拿來炫耀詞匯量的而是拿來讓明天的自己少掉點頭發(fā)的。如果你手頭正有一個分支發(fā)散得很難受的創(chuàng)建邏輯不妨試試這個路徑。寫完最后一行你多半會跟我一樣覺得那點重構(gòu)的功夫真值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
玖玖综合玖玖| 能看的AV| 激情久久久久久| 色99视频| 五月丁香激情婷婷| 丁香五月区| 久久9精品| 五月婷婷先锋| 一级黄在线| 99色在线| 色婷婷久久综合中文久久一本| 天天综合 99久久婷婷| 婷婷成人基地| 国产精品18久久久| 人人摸人人| 五月天综合视频网| 五月天激情啪啪| 婷婷激情中文综合| 亚洲精品国产setv| 婷婷免费无马| 久婷| 亚洲六月色婷婷| 99热8在线| 91狠狠色丁香婷婷综合久久| 色综合色综合网| 激情九九这里只有精品| www.狠狠干com| 亚洲色9| 九九99热久久精品66中文字幕| 麻豆AV一区二区三区| 九九99精品| 99热精品无码| 97超碰在线免费观看| 亚洲AV成人无码久久精品老人法拉利| 天天爽夜夜爽夜爽精品| 丁香婷婷十月| 狠狠色婷婷综合开心影视| 国产精品电| 香蕉久久国产AV一区二区| 综合婷婷五月丁香在线观看| 激情宗合网激情五月天| 岛国av电影网站| 日韩抽插操逼| 婷婷五月天影视| 狠狠狠婷婷五月综合| 综合激情五月丁香| 狠狠狠婷婷五月综合| 久久色区| 99热这是里只有精品| 五月丁香综合啪啪| 久久五月丁香激情综合| 狠狠草综合网| 丁香婷婷91在线观看视频| 99乱视频| 丁香五月天啪啪| 狠狠人妻色综合| 91久久精品无码一区二区三区| 久久久九九九 99| 在线不卡的视频| 影音先锋综合网| 超级碰 久久9| 91久久1118| 五月婷婷激情久久| site:minyis.com| 五月丁香六月婷婷综合免| caopeng超碰| 开心亚洲久久开心| 亚洲第一第二网站| 丁香五月六月综合激情| 婷婷五月丁香激情| 久久9视频欧美| 色婷婷久久综合| 亚洲精品电影| va婷婷| 99热都是精品| 久久激情视频| 91无码高清| 久久9视频| 99亚色色色| 丁香五月瑟瑟| AV网站免费在线| 99视频在线| 99热在线播放| 在线观看996精品| 九九aV| 欧美婷婷六月丁香综合色连续高潮抽搐| 婷婷五月在线综合| 欧美日韩aaa| 婷婷综合激情| 久久全色| 黄页大全十八禁| 人人摸人人搞| ..真实国产乱子伦对白在线_欧 | 亚洲中文字幕网| 国产精品色情AAAAA片软件| 五月婷婷黄色网址| 六月丁婷婷| 丁香5月婷婷| 99视频只有精品| 热久久99热欧美国产亚洲| 婷婷五月久久| 色综合爽| 亚洲激情在线| 噜噜狠狠色综合久| 欧美激情五月| 欧美性生交XXXXX无码小说| 免费看无码视频A级| 日韩好吊操| 婷婷六月激情综合| 色婷婷很很丝袜| 狠狠色丁香婷婷久久综合| 成人五月天在线观看| 天天爽免费视频| www五月| 伊人久久综合| 99视频日韩| 99精品久久| 99精品视频网站| 欧美肉大捧一进一出免费视频| 久久狠婷婷| 婷婷五月天,影院| 五月婷婷激情日本| 久热伊人9| 91视屏在线观看com.wwwvv| 天天操夜夜操| 日日操夜夜操无码免费| 99热在线观看免费精品| 五月天大香蕉AV| 亚洲小说欧美激情| 精品欧美性爱超级爽| www色色色com| 99热这里只有精品2| 91久久电影| 五五月五月| 色黑鬼导航| 亚洲综合九九| 蜜臀AV在线成人| 丁香五月婷婷网| 北条麻妃九九九国产精品视频| 综合婷婷| 97色婷| 深夜男女福利刺激影院一区完整| 啪啪综合| 亚洲一个色| 97干在线视频| 26uuu.| 99在线观看| 五月天婷婷伊人| 九九热99热| 久久丁香婷| 人妻videos人妻高清| 久久综合五月天| 大香蕉人妻| 久久婷婷影院| 五月色情婷婷开心五月色情| 丁香婷婷天堂| 99热这里只有精品搜| 91打屁股免费看| 激情亚洲五月| 九九九九中文字幕| 成人 在线 日韩| 波多野结衣AV无码Porn| 热九九精品| 激情综合五月| 亚洲亚洲人成综合网络| 五月丁香六月婷婷视频| 99热网址| 婷婷亚洲综合| 婷婷基地爱| 五月天婷婷激情网| 激情五月婷婷五月| 国产一区男女| 1024成人在线观看| 天天干天天干天天| 99国产性感视频| 波多野结衣成人作品在线| 五月天久久综合婷婷丁香| 日本nghangse中文字幕| 999婷婷综合| 九九碰九九爱97超碰| 午夜丁香婷婷| 情趣视频66| 激情五月综合久久| 亚洲V国产V欧美V久久久久久| 五月丁香AV、伊人业余、性色熟妇| 日本欧美成人片AAAA| 色丁香五月综合网| 亚洲婷婷视频| 亚洲天堂青草| 久久精彩视频| 久久五月天视频| 中文网AV| 影音先锋91资源站| 97亚洲视频在线| 亚洲va欧洲va国产va不卡| 婷婷刺激综合| 亚洲六月综合激情久久下卡| 色婷婷久久综合| 白天AV月月| 99精品女人天堂| 激情五月婷| 天天插天天干天天舔| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 香港九九六区八区99| 五月天播播中文字幕| 亚洲精品亚洲人成人网| 色五月婷婷影视| 国产亚洲在线| 干一干xxxx| 天天日,天天射,天天插| 97在线/亚洲| 99噜噜噜在线播放| 天天日天天摸| 超碰人人操人人干| 色婷婷综合影院| 精品国产va久| 婷婷丁香社区网| 91怕怕网| 99综合97| 人妻内射一区二区在线视频| 色~性~乱~伦~噜| 国产精品久久久丁香五月八戒视频| www.91.com黄| 国产操肏网站| 97色综合视频| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 嫩草AV久久伊人妇女超级A| 99热在线这里| 狠狠狠夜夜夜| 狠狠五月综合在线| 久久99成人性爱高清视频| 狠狠操之狠狠操| 女人天堂久久| 色婷婷色综合激情91| 九月婷婷在线视频| 久久五月婷天天干| 激情性爱五月天网页| 亚洲九九视频| 天天爱天天爽| 色婷婷丁香五月| 五月婷婷熟女| 色婷视频| 大香蕉啪啪啪| 色五月成人| 成人网站在线观看视频| 亚洲热久久| 日本一毛片| 能直接看的av网站| 国产激情在线| www.久久| 日本三级中国三级99人妇网站| 色婷婷免费视频| 色五月播五月| 天天射美女| 狠狠干在线| 欧美日韩AAAA| 九九精品亚洲| a网站免费观看| 色丁香五月| 日韩欧美颜射| 人人摸人人干| 色吧网91| 亚洲另类av| 色五月综合97| 久久xx| 婷婷操逼| 五月婷婷精品视频| 国产无套精品一区二区| 99精品热视频| 五月婷婷综合激情| 高清a片基地| 色婷婷色丁香色欲av| 31色区视频免费看| 香蕉国产2013| 五月丁香六月婷婷综合网| 天天草天天舔| 激情5月婷婷| 天天色噜| 九九热最新视频| 99无码视频| 黄急一级视频| 国产成人AV在线播放| 色情五月婷| 91婷婷丁香| 日日天天天| 啪啪婷婷五月天激情| 日日操,夜夜爽| 五月婷婷六月丁香在线| 大香蕉伊人久久| 色五月激情五月| yw.av| 99九九玖玖| 久久视这里只有精品| 婷婷五月天少妇| 99成人免费热视频| 另类激情综合| 这里只有精品视频免费在线观看| 激情小说视频图片| 在线亚洲综合| 色性综合| 五月丁香成人视频| 三人荫蒂添的好舒服A片| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 秋霞三及片| 97操碰视频| 五月婷婷综合在线| 久热黄色| 五月丁香六月婷婷在线| 丁香六月激情综合| 97超碰人人操| 婷婷五月天六月丁香| 99热精品在线| 另类激情四射| 人人视频色| 激情亚洲网| 综合九色| 精品少妇蜜臀91| 91九色国产在线| 成熟妇人A片免费看网站| 婷婷综合国产| 在线五月色播| 亚洲激情五月| 色欲色香综合网| 99久久97| 狠狠操在线视频| 色狠狠999综合| 婷婷久综合| 日韩ac不卡无码| 色综合激情| 国产成人精品亚洲线观看| 嫩草视频观看| 欧美美美女性色视频| 丁香六月啪啪| 婷婷色激情网| 五月天婷婷基地| 99婷婷综合| 九九综合视频在线观看| 99热91| 九九综舍久久| 欧美性爱五月天| 性欧美大战久久久久久久83| 亚洲国产精品五月天| 五月丁香六月激情| 综合色网站| 亚洲va在线∨a天堂va欧美va| 国产精产国品一二三在观看| 色区久久| 六月丁香五月天| 中文精品在| 99热这里只有精品5| www.色欲丁香婷婷| 99免费视频网| 久热精品在看| 影音先锋偷偷色男人站| 五月天丁香综合| 色婷婷超碰| 91精品无码久久久久久五月天| 99热这里只有在线| 91人人看| 人人爱人人草| 色久女| 91日视频| 国产亚洲99久久精品| 久热中文字幕| 国产伊人五月天| 91综合在线| 激情文学天天| 男人先锋久久| 天天玩夜夜操| 另类图片色五月| 99啪啪| 色色热| 色情五月天视频网| 香蕉人妻AV久久久久天天| 五月激情久久综合| www.玖玖婷婷在线| 日本美女上人| 麻豆科斗777| 国产乱妇乱子在线播视频播放网站 | 97在线刺激| 五月天天堂久久| 亚洲色涩视频| 色婷婷五月天av在线| 五月激情丁香| 在线中文亚洲| 五月色综合| 婷婷五月天激情小说网站| www久视频com| 婷婷色情 | 丁香五月婷久久| 久久婷婷五月综合色和| 日熟女| 亚洲色图五月丁香| 色五月丁香网| 丁香六月天之亚州热女| 久久久久久久,99精品视频| 婷婷五月丁香六月综合网| 婷婷九色| 香蕉人妻AV久久久久天天| 六月婷色六月| 激情综合五| 97色碰| 天天日夜夜帕| 丁香五月天无码AV| 日本三级片片| 麻豆AV一区二区三区| 天天干天天叉| 激情五月开心五月在线视频| 国产欧美大香蕉一区| 丁香五月在线自慰| 久99久热只有精品国产99| 色偷偷色婷婷| 婷婷基地五月色| 91嫩草久久| 久色激情| 五月丁香啪啪啪| 77799热| 日本 色综合| 91Chinese在线| 99热6精品| 如何安全看伊人婷婷| YW无码| 五月婷激情| 9一精品视频观看| 色综合色色| AVDV久久| 天天干天天叉| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 踪合专区啪啪| www.91AV.com| 亚洲狠狠终合停停终合| 能看的AV| 99热都是精品| 在线婷婷| 天天干天天做| 色七七色九九| 日韩色色视频www| 精品国产va久久久久| 激情国产综合| 丁香五月婷婷www..com| 91精品刘玥| 少妇大叫太大太粗太爽了A片 | 天天操天天爱天天日| 欧美丁香五月夫妻天| 成人婷婷五月天| 久久免费9| 狠狠综合色网| 天综合日日夜综合7799| 婷婷性爱五月天丁香网| 西西4r午夜剧场| 777精品久无码人妻蜜桃| 欧美色色色| 丁香六月激情四射| 99在线视频播放| 色婷婷狠狠| 国产精品香蕉| 啪啪操操| 色婷婷五月影院| 色婷婷亚洲综合天堂| 农村熟妇高潮精品A片| 色婷婷久久综合中文久久一本| av在线激情| 9l视频自拍9l视频自拍九色学生| 99精品网| 国产亚洲精品久久一区二区三区| 99热这里精品| 九九 激情 网| 五月婷婷av| 激情五月天影院| www夜夜操| 高清无码入口| 日本欧美成人片AAAA| 激情五月综合| 国产黄色在线| 亚洲成人综合网在线免费观看| 天堂在线伊久| 9999热在线观看| 日亚二欧美| 日本婷久久| 激情性爱五月天| 色10月婷婷视频| 欧美特大片黄| 五月花激情网| 婷婷操逼| 丁香五月在线视频黑人| 一级黄色尤物综合视频手机在线观看| 91青娱乐青青草| 另类图片色五月| www.婷婷六月天| 白人荫道BBWBBB大荫道| 精品9l九九九九九77777| 九九精品系列| 午夜大香蕉| 五月天a婷婷伊人| 热成人网| 欧美色色色| 做爰丰满少妇1313| 激情五月丁香六月综合AVXXXX| 热99免费在线| wwccc久久久| 亚洲热久久| 国产91视频| 成人综合网站| 婷婷五月丁香91| 青青夜夜狠狠夜夜狠狠| 五月成人天| 九九色99| Av中文在线| 色伊人婷婷| 婷婷五月激情片| 色婷婷五月天视频网站| 99性爱| 五月婷av| 亚洲综合视频天天精品| 五月婷婷丁香五月| 性欧美大战久久久久久久83| 9福利性视频欧美| 欧美美女国产日韩一区二区久 | 熟妇内谢69XXXXXA片| OUMEIRIHANCHENGREN| 97香蕉碰碰人妻国产欧美| 欧美综合激情五月| 99热这里有精品| www色哟哟| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 夜夜资源站| 五月丁香色婷婷熟女| 九九九九毛片| 大香蕉伊在| 色在线五月天免费| 色色婷婷五月天| 亚洲日比视频| 五月丁香网站在线播放| 综合激情视频| 一区二区成人电影| 99这里| 专区无日本视频高清8| 六月丁香色色| 第四色五月天| 91 久热| 日本无va视频| 五月丁香在线| 狠狠搞五月天| 另类天堂| 99人妻碰碰碰久久久久禁片| 色激情五月天| 91九色在线观看免费| 国产丁香五月天婷婷| 天天狠天天叉| 激情综合网五月婷婷| 尔尔AV一区| 91九色PORNY肉丝在线| 日日日,com| 亚洲综合99| 五月激情综合性爱| 夜夜撸夜夜骑| 99精品高潮| 婷婷激情社区| 九九热青青草| 五月婷综合| 中文字幕av久久爽| 九九色综合九九色| 色99视| 丁香涩涩爱| 婷婷综合玖玖五月| 五月花综合视频| Caoub青青超碰 | 变态另类色图| 这里只有精彩视频| 九九狠狠干| 91超级碰在线视频| 99性视频| 丁香六月婷婷| 影音先锋 91工厂| 国产精品第一国产精品| 色性五月天| 99精品久久久久久久久| 91午夜激情| 射久久丁香五月| 六月婷婷视频| 五月丁香啪啪网| 婷婷五月六月丁香| 森林影视大全,最好看的2019年视频 | 婷婷五月天色色| 激情五月,色五月| 91啪啪视频| 天天爽,天天操。| 亚洲网在线观看| 婷婷五月天成人网站| 综合久久综合五月天婷婷| 亚洲成人va| 日本理论久久| 亚洲色视频| 成人五月天在线视频在线观看| 农村熟妇高潮精品A片| 天天射天天射一道本日本社区 | 香蕉五月婷婷| 色色色99| 五月天小说激情| 免费色婷婷| 激情婷婷久久| 深爱激情九九五月天 | 99热精品少| 欧美日韩婷婷五月天| 日日噜噜夜夜狠狠久久丁香六月| 四色永久成人网站| 婷婷在线日韩综合| 在线视频另类| 六月丁香婷婷开心综合基地| 99伊人性爱在线影院| 99综合网| 玖玖婷婷五月天| 99这里有精品久久97| 91人人爱| 五月婷婷中文字幕| 四色99久久| 九九九这里只有精品| 欧美在线ee日韩| 超碰色综合| 亚洲久久婷婷丁香五月天| 久热伊人9| 久/久精品99看9| 丁香五月另类小说| 亚洲色爽| 激情亚洲婷婷| 日逼影音先锋男人资源站| 综合色图区| 五月婷婷五月天亚洲无码| 色狠狠999综合| 婷婷五月天VI| 性色五月天| 久久久免费精彩视频| 九九精品片一| 五月婷婷五月天| 91怕怕网| 色色欧美。| 9999久久久久| 综合狠狠干| 久久精品66| 亚洲精品乱码久久久久久综合| 国产91九色| 五月综合人妻| 国产特级毛片AAAAAAA高清| 国产婷婷五月天| 日日夜夜狠狠干| 77799热| 亚洲国产成人综合| 大香蕉狼人久久| 91五月花丁香| 五月停性愛| 久久视频在线视频| 五月婷婷综合网| 丁香五月婷久久| 日本久久性| 综合色播| 天天骑天天操| 婷婷日日夜夜| 一起草性爱不卡视频| 颜射 精品性爱av| 69堂午夜视频最新地址| 丁香九月综合| 女性自慰系列第五页| 久久99久久99精品免观看粉嫩| 国产精品A片在线| 五月婷婷丁香日韩在线| 婷婷99视频在线| 亚洲国产精品VA在线看黑人| 99性爱视频| 久久婷综合| 五月综合视频| 丁香六月婷婷久久综合| 五月丁香啪啪网| 五月香婷婷| www.婷婷| 狠狠精品干练久久久无码中文字幕| 九久9精品| 99色色网| 五月天丁香色色| 丁香五月婷婷av影院| 日本91在线播放| 色噜噜狠狠狠狠色综合久欧美| 2025超碰| 9 1大香蕉| 色婷亚洲五月丁香| 亚洲AV综合网| 成人天天爽| 五月丁香六月婷婷中合网| 色婷婷六月激情| 色五月婷婷啪啪五月| 色婷婷丁香五月综合| 99热这里有精力| 狠狠色成人影片| www.五月婷婷.com| 丁香六月婷婷| 亚洲三A| 狠狠色中色| 激情五月色综合网| 亚洲日韩国产黑丝黑丝AVAV一区二区三区| 中文字幕丰满乱孑伦无码专区| 欧洲激情五月天婷婷| 99人人操人人摸| 色婷狠狠| 五月亭亭开心网| 久久综合婷婷激情| 久久999久久999久久999久久| 97干欧美| 第四色婷婷五月| 特级西西4444www无码| 新97人人上人人| 五月天激情小说网| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 色婷婷电影| www.金莲av| 色九月国产| 在线国产精品色| 99这里只有精彩视频| 99色精品| 免费无码毛片一区二区A片| www久久久久久久| 国产亚洲在线| 亚美欧色影院| 色99色| 二区成人视频| 99re在线观看| 色五月综合在线| 日本婷婷五月天| 激情骚五月| 久久99热这里| www.日本91| www.9操| 亚洲AV综合在线观看| 色五月激情基地| 日本片日本片祼观看网站在线看中文版网页在线看| 97超碰免费超级在线观看| 激情久久久久久久久| 插插五月天| 香蕉综合网| 五月天久久激情| 久婷婷久草| 色婷婷小说| 欧美激情伊人| 五月丁香啪啪综合网| 色综合激情| 激情久久 婷婷| 久久AV电影| 思思热在线视频精品| 91视频精品99| 国产激情综合五月久久| 国产全是老熟女太爽了| 99热精品免费| www.久久久久久久| 六九色综合婷婷五月天| 天天狠狠夜夜狠狠2023| 99久热精品在线| 五月天激情开心网| 欧美槡BBBB槡BBB少妇| 婷婷五月丁香久久| www.婷婷,com| 欧美黑人巨大性生话| 99色色网| 亚洲熟妇无码乱子AV电影| 亚洲六月综合激情久久下卡| 99热这是里只有精品| 色情丁香五月婷婷精品| 免费看片操逼| 99综合色| 色婷婷人人| 六月丁香激情最新更新| 五月天激情综合网| 电影《战争与艾拉》免费观看| 日韩成人综合网| 99狠狠色| 香蕉国产2013| 99日在线视频| 亚洲精品99| 伊人久久大香蕉网| 色综合网址| www.色五月.com| 色99视频| 97香蕉碰碰人妻国产欧美| 九色啦蜜臀| 五月丁香在线观看99| 九九热婷婷| 无码区婷婷五月花开| 婷婷精品在线| 婷婷放心五日爱| 激情综合网五月婷婷| 亚洲色婷婷色| 开心五月婷婷| 丁香五月天激情综合网| 五月婷婷黄网站大全| 99热这里只有精品16| 激情综合在线播放| 久久婷婷啪啪视频| 99在线观看视频免费| 99热久| 99在线视频在线观看| 久久久久久五月天| 婷婷色五月在线视频| 五月天婷综合| 色五月在线观看| 最新日本A片| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲XX日本| 久久综合55| 五月天婷婷AV| WWW.久久.COM| 久久国产色| 亚洲综合视频在线| 少妇人妻人伦A片| 亚洲五月情| 一级二级色大片| 色播五月天激情| 五月综亚洲| 婷婷狠狠青青| 99精品久久久久久久婷婷| 4399在线观看免费高清电视剧| 亚洲国产精品SUV| 玖玖资源站蜜臀| 久久综合综合久久| 久久AV无码精品人妻系列试探| 99愛国产| 色婷婷丁香五月天| 天天干天天av天天射| 96精品久久久久久久久| 婷婷在线操| 色婷婷情片| 色婷婷影院| 九九热精品视频| 五月综合激情久久| 永久热91| 国产亚洲精品AAAAAAA片| 老司机日日夜夜青草| 亚洲成人网站在线观看| 丁香六月综合| 婷婷综合五月| 激情综合激情综合| 开心五月婷婷六月丁香| 色色色97| 97色 五月天丁香| 亚洲熟女色| 色婷婷五月天在线| 另类小说五月天| 免费观看高清无码| 五月丁香成人网| 欧美日韩成人在线网| 深爱五月天天| 五月婷亚洲精品AV天堂| 九月婷婷人人操人人舔人人爱| 久久婷婷影院| 五月丁香六月在线| 五月天伊人日日噜影片AV| 久久9精品视频| 殴美97色| 天天色天天操天天射| 婷婷色导航| 婷婷婷婷婷婷婷婷| 伊人五月网| 深爱激情中文五月天av| 久久一品区| 成人在线观看国产| 丁香六月婷婷久久综合| 五月天丁香久久| 看国产探花操逼三级片| 婷婷五六日| 成人五月天综合网| 色热久| 久婷久婷激情肉| 丁香五月激情啪啪啪| 爱爱网址9| 狠狠综合网| 五月婷婷成人| 久久久8| 色综合九九| 香蕉色色网| 黄色国久久| 精品夜夜澡人妻无码AV| 中文字幕在线免费观看视频| 国产精品久久..4399| 亚洲免费观看高清完整版AV线| 五月丁香操亭亭网| 丁香五月,激情五月,深爱五月| 亚州激情网站无码| 色八月婷婷| 男人的天堂999| 国产韩日亚洲美州欧亚综合在线| 久久香蕉福利| 香蕉操亚洲| 五月婷六月| 五月天丁香网站| www.91操| 97人人干| av婷婷丁香 六月| 日韩欧美一区二区三区四区| 他改变了拜占庭| 婷婷 久综合| 99热这里只有精品21| 激情婷婷色小说| 99热这里只有精品手机在线观看| 激情五月天啪啪视频| 激情婷婷内射| 秋霞电影理论| 天天日天天干天天插天天射| 开心五月深爱婷婷| 五月婷婷香| 丁香久久五月婷综合| 成人在线网| 97色色网| 91妻人人爽人人看片| 丁香影院五月综合| 五月丁香婷婷啪啪综合| 久久总和99| 五月丁香六月色婷| 亚洲激情电影五月天色婷婷丁香一起草| 69五月天视频| 四月婷婷丁香| 丁香五月激情综合| 五月天激情小说| 伊人激情啪啪| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 日本精品人妻无码77777| 在线看的免费网站| 天色色综合网| 99re热99| 久久久久综合激动五月天| 深爱激情av| 久热这里| 五月丁香影院| 黄色av网站在线免费播放| 男人的天堂97| 5月色婷婷| 五月天婷网| 婷婷人人操| 国产亚洲精品AAAAAAA片| 久热99中文字幕| 欧美日比视频| 五月丁香五月激情综合色综合| www、色色色| 久久久久久欧美精品se一二三四| 国产亚洲精品AAAAAAA片| 97超喷视频在线观看| 99ri久久| 久噜久噜| 婷婷涩五月| 丁香五月婷婷综合啪啪| 激情六月婷婷| 久久这里只有国产精品视频| 日韩人妻无码精品| 日韩av一区二区在线/日产精品久久久| 99热在线观看99| 人人爽在线视频综合网| 色五月六月| 国产毛片精品一区二区色欲黄A片| 9热成人在线视频| 久久女婷| 99热99热在线| 可以免费观看的AV| 精品人妻在线| www.夜夜騎夜夜狠| 人妻啪啪啪| 情一色一乱一伦一91A| 99久久a线观| 超碰97干| 亚洲9久久精品| 丁香六月婷婷综合激情欧美 | 亚洲愉拍99热成人精品| 五月丁香婷婷综合久久| 十月丁香九月婷婷综合| 色色五月天激情| 久婷久婷| 色五月激情婷婷| 成人做爰A片免费看视频| www.91在线观看| 天天色综合网1| 婷婷五月综合激情| 日韩人妻在线观看| 激情欧美五月丁香| 五月婷婷色欲| 色狠狠999综合网| 激情婷婷色色| 97操碰在线视频| 99在线观看视频| http://www.com久久久精品一区| 久久久久妻| 婷婷射图| 激情婷婷综合网| 久久九九大香蕉电院| 粉嫩AV久久一区二区三区| 第四色激情网| 99在线视频播放| 九月婷婷在线观看| 日日夜夜综合| 97久久人人人干| 日韩99色| 97操碰| 天天激情5月天亚洲| 玖玖爱综合网| 久久精品综合色| 综合图片色色| 久久伊人婷| 五月天天天色| Av在线资源| 激情六月日韩| 丁香五月天亚洲综合| 丁香五月婷婷操逼| 色射婷婷五月天| 五月丁小婷婷激情四射| 亚洲色色精品| 日韩青青| 91久久婷婷人人澡草 | 狠狠狠狠狠狠狠狠| 亚洲天堂青草| 五月激激激情综合网| 91久久人人操| 激情五月天 婷婷| 热996精品在线观看| 丁香五月婷婷在线观看| 婷婷五月娱乐在线| 99热这里只有精品在线| 激情五月瑟瑟| 99热a片免| 午夜成人在线免费视频| 色色色色色色色色色色色色色97| 99久久.www| 久青操| 激情综合亚洲| 婷婷五月成人| 色婷婷综合五月| 久久婷婷五月天激情新地址| 色婷婷a三区麻| 毛片九九九九九九九九18| 亚洲综合狠狠艹| av五月天婷婷丁香| 久久视频婷婷| 天天色天天射天天日| 美日韩成人| 国内裸舞二区| 九月丁香久久网| 日本颜色视频人人爱| 狠狠爱婷婷丁香| 久热超碰| 开心五月色婷| 91天堂网综合| 9久久精品| 日韩99色| 亚洲无码免费看| 日本啪啪天堂| 亚洲欧洲自拍图片专区五月天| 97碰碰九九视频| 婷婷成人AV| 婷婷五月丁香五月丁香| 97操资源婷婷| 久久99久久99精品免观看粉嫩| 激情综合啪啪啪| 婷婷五月综合性爱| 999精品乱码77777| 在线区区区| 久久久久久9热不雅视频| 激情五月天开心| 激情啪啪五月天| 9久操| 丁香五月激情网| 夜丁香综合| 任你艹| 日本97在线看片| 丁香五月天啪啪| 天天干狠狠艹| 色就是色婷婷五月亚洲激情| chaopeng在线人人| 99综合视频| 久久这里有精品视频| 超碰在线国产| 玖玖综合色区在线观看| 中文字幕在线免费观看视频| 亚州日本欧州韩美高青高潮一| www.婷婷,com| 538在线精品| 婷婷午夜精品久久久| 亚洲中文乱字字幕线在永久| aa久久| 操逼综合激情网| 99re6久热只有精品6在线直播| 婷婷五月天综合小说网| 久去色色| 大香蕉伊在| 亚洲成av人影院| 成人丁香五月| www激情婷婷com| 99re这里只有精品免费| 久九九热| 色啪久| 狠狠狠狠狠狠| 色婷婷久久久| 色婷狠狠| 六月婷婷亚洲| 99热精在线九九久久保| 久久婷婷五月综合色奶水99啪| 超碰天堂网| 69精品人人人人| 免费观看亚洲AV片| 婷婷伊人五月天| 色色婷婷综合网| 婷丁五月| 久久电影4399| 超级碰碰视频无码| 激情婷婷五月丁香啪啪啪| 热久精品| 丁香婷婷九月| 色五月综合激情| 开心五月综合激情综合五月| 人人干天天舔| 亚洲精品视频在线| 91久久九久久九久久九久久九久久| 久久免费少妇高潮99精品| 五月开心网| 色狠狠999综合| 五月综合视频| 欧美激情综合五月色丁香| 日韩综合大黄| 五月婷婷之综合激情在线| 色五天综合| 鲁鲁色五月| 免费视频WWW在线观看网站| 激情五月婷婷视频一区二区三区| 色情久久久| 极品另类| 98色花堂98t.R| 天天插天天插| 五月天激情网图片| 欧洲色| www.maotanji.com| 一区二区乱码视频| 丁香五月色网| 人人操插| 激情五月丁香五月| 狠狠色婷婷| 99自拍视频在线观看| 九九碰九九爱97超碰| 久久婷五月| 伊人在线视频| 伊人久久丁香狠狠婷婷综合香蕉 | 99九九99九九九视频精品| 国产AV成人精品| 97亚洲精品| 国产色视频网站2| 91九色小视频| www.色综合| 婷五月丁香俺| 久久婷婷五月综合激情国产| 99久久成人| 亚洲成人黄色网| 日本天天操| 色色色色色色色色网站| 中文字幕在线观看视频www| 内射干少妇亚洲69XXX| 日本WwW色偷偷丁香花久久久京东热| 精品九九九久| 久久狠婷婷| 99视频自拍| 天天综合插插| 79色色色色| 五月天婷婷操逼视频| 狠狠操狠狠操AV| 丰满少妇猛烈A片免费看观看| av操B网站| 影音先锋91| VA日本视频| 不卡影院午夜理论片| 激情小说婷婷| 五月天婷婷视频| 久久人妻少妇嫩草AV| 久久精品日| 婷婷伊人网| 丁香婷停五月激情综合深爱| 噜噜色噜噜网| 色婷婷狠狠爱| 色五月丁香com| 激情亚洲婷婷| 五月婷婷香蕉| 天堂综合久久 | 激情网综合| 婷婷激情九月| 97超碰免费超级在线观看| 激情 婷婷| 色99亚洲| 久久人妻人人| 99碰碰| 人人操人人看97干| 搡BBBB搡BBB搡18| www99xxxx五月丁| 成久综合视频| 夜夜躁爽日| 天天插天天插| 黄色91在线观看| 色婷婷在线视频久| 国产va视频| 国产AV一区二区三区日韩| 日本精品九九九| 午夜精品777| 欧日韩成人| 香蕉视频性爱BB做爱| 亚洲综合字幕色色| rr天天操| 亚洲精品V天堂中文字幕| 久草a片| 久久视频九九视频| 激情五月六月婷婷| 亚洲视频码| 亚洲激情高潮| 丁香花色色网| 啪啪色激情五月天| 色色色激情| 涩婷婷五月天在线精品视频| 极品少妇高潮啪啪AV无码| 九九色色色| 精品无码99| 欧美经典片免费观看大全| 久久婷婷五月天激情四射| 五月婷婷影视| 99在线精品免费视频| 91久草五月天婷婷| 五月天欧美 另类小说| 玖玖爱伊人| 久热re在线视频| 97色婷婷五月天| 国产精品VIDEOSSEX久久发布| 丁香婷婷色| 日日夜夜天天综合| 久久se 综合网| yazhou seshipin| 黄色AV日韩| 亚洲免费观看高清完整版AV线| 丁香久久五月天视频在线观看| 99精品热| 色色色在线观看| 色99在线视频| 播丁香五月婷婷欧美| 激情婷婷综合| 天天爽天天干| 九九99九九99偷拍视频免费看| 99久久激情视频| 爱操天堂| 另类国产综合| 国产亚洲精品久久久久久郑州| www.久久99| 99日韩| 亚洲av免费在线| 任你日视频| 久99在线视频| 99在线免费视频| 99玖玖人人| 五月激情天| 琪琪色热色色| 秋霞AV淫| 全高清无码视頻| 人人操插| 五月婷婷久久综合| 精品久久99码| 国产成人av在线| 婷婷色在线| 这里只有精品视频222| 日韩视频99| 婷婷五月花免费视频在线| 任你草| 亚洲第精品| 国产精品 的国产|