精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

工廠模式進階用法,如何動態(tài)選擇對象?

開發(fā) 前端
我們通過一個例子,不斷迭代帶大家理解了工廠模式,工廠模式是一種創(chuàng)建型設(shè)計模式,用于創(chuàng)建同一類型的不同實現(xiàn)對象。我們來總結(jié)下這種動態(tài)選擇對象工廠模式的優(yōu)缺點。

前言

工廠設(shè)計模式可能是最常用的設(shè)計模式之一,我想大家在自己的項目中都用到過。可能你會不屑一顧,但這篇文章不僅僅是關(guān)于工廠模式的基本知識,更是討論如何在運行時動態(tài)選擇不同的方法進行執(zhí)行,你們可以看看是不是和你們項目中用的一樣?

小菜鳥的問題

直接上例子說明,設(shè)計一個日志記錄的功能,但是支持記錄到不同的地方,例如:

  • 內(nèi)存中
  • 磁盤上的文件
  • 數(shù)據(jù)庫
  • 百度網(wǎng)盤等遠程存儲服務

面對這么一個需求,你會怎么做呢?我們先來看看小菜鳥的做法吧。

  1. 小菜鳥創(chuàng)建了一個Logger類
class Logger {
public void log(String message, String loggerMedium) {}
}
  1. 小菜鳥想都不想,直接一通if else。
class Logger {
public void log(String message, String loggerMedium) {
if (loggerMedium.equals("MEMORY")) {
logInMemory(message);
} else if (loggerMedium.equals("FILE")) {
logOnFile(message);
} else if (loggerMedium.equals("DB")) {
logToDB(message);
} else if (loggerMedium.equals("REMOTE_SERVICE")) {
logToRemote(message);
}
}

private void logInMemory(String message) {
// Implementation
}

private void logOnFile(String message) {
// Implementation
}

private void logToDB(String message) {
// Implementation
}

private void logToRemote(String message) {
// Implementation
}
}

現(xiàn)在突然說要增加一種存儲介質(zhì)FLASH_DRIVE,就要改了這個類?不拍改錯嗎?也不符合“開閉原則”,而且隨著存儲介質(zhì)變多,類也會變的很大,小菜鳥懵逼了,不知道怎么辦?

有沒有更好的方法呢?

這時候小菜鳥去找你幫忙,你一頓操作,改成了下面這樣:

class InMemoryLog {
public void logToMemory(String message) {
// Implementation
}
}

class FileLog {
public void logToFile(String message) {
//Implementation
}
}

class DBLog {
public void logToDB(String message) {
// Implementation
}
}

class RemoteServiceLog {
public void logToService(String message) {
// Implementation
}
}

class Logger {
private InMemoryLog mLog;
private FileLog fLog;
private DBLog dbLog;
private RemoteServiceLog sLog;

public Logger() {
mLog = new InMemoryLog();
fLog = new FileLog();
dbLog = new DBLog();
sLog = new RemoteServiceLog();
}

public void log(String message, String loggerMedium) {
if (loggerMedium.equals("MEMORY")) {
mLog.logToMemory(message);
} else if (loggerMedium.equals("FILE")) {
fLog.logToFile(message);
} else if (loggerMedium.equals("DB")) {
dbLog.logToDB(message);
} else if (loggerMedium.equals("REMOTE_SERVICE")) {
sLog.logToService(message);
}
}
}

在這個實現(xiàn)中,你已經(jīng)將單獨的代碼分離到它們對應的文件中,但是Logger?類與存儲介質(zhì)的具體實現(xiàn)緊密耦合,如FileLog、DBLog?等。隨著存儲介質(zhì)的增加,類中將引入更多的實例Logger。

還有什么更好的辦法嗎?

你想了想,上面的實現(xiàn)都是直接寫具體的實現(xiàn)類,是面向?qū)崿F(xiàn)編程,更合理的做法是面向接口編程,接口意味著協(xié)議,契約,是一種更加穩(wěn)定的方式。

  1. 定義一個日志操作的接口
public interface LoggingOperation {
void log(String message);
}
  1. 實現(xiàn)這個接口
class InMemoryLog implements LoggingOperation {
public void log(String message) {
// Implementation
}
}

class FileLog implements LoggingOperation {
public void log(String message) {
//Implementation
}
}

class DBLog implements LoggingOperation {
public void log(String message) {
// Implementation
}
}

class RemoteServiceLog implements LoggingOperation {
public void log(String message) {
// Implementation
}
}
  1. 你定義了一個類,根據(jù)傳遞的參數(shù),在運行時動態(tài)選擇具體實現(xiàn),這就是所謂的工廠類,不過是基礎(chǔ)版。
class LoggerFactory {
public static LoggingOperation getInstance(String loggerMedium) {
LoggingOperation op = null;
switch (loggerMedium) {
case "MEMORY":
op = new InMemoryLog();
break;
case "FILE":
op = new FileLog();
break;
case "DB":
op = new DBLog();
break;
case "REMOTE_SERVICE":
op = new RemoteServiceLog();
break;
}

return op;
}
}
  1. 現(xiàn)在你的 Logger類的實現(xiàn)就是下面這個樣子了。
class Logger {
public void log(String message, String loggerMedium) {
LoggingOperation instance = LoggerFactory.getInstance(loggerMedium);
instance.log(message);
}
}

這里的代碼變得非常統(tǒng)一,創(chuàng)建實際存儲實例的責任已經(jīng)轉(zhuǎn)移到LoggerFactory?,各個存儲類只實現(xiàn)它們?nèi)绾螌⑾⒂涗浀剿鼈兊奶囟ń橘|(zhì),最后該類Logger?只關(guān)心通過LoggerFactory?將實際的日志記錄委托給具體的實現(xiàn)。這樣,代碼就很松耦合了。你想要添加一個新的存儲介質(zhì),例如FLASH_DRIVE?,只需創(chuàng)建一個實現(xiàn)LoggingOperation?接口的新類并將其注冊到LoggerFactory中就好了。這就是工廠模式可以幫助您動態(tài)選擇實現(xiàn)的方式。

還能做得更好嗎?

你已經(jīng)完成了一個松耦合的設(shè)計,但是想象一下假如有數(shù)百個存儲介質(zhì)的場景,所以我們最終會在工廠類LoggerFactory?中的switch case?部分case數(shù)百個。這看起來還是很糟糕,如果管理不當,它有可能成為技術(shù)債務,這該怎么辦呢?

擺脫不斷增長的if else?或者 switch case?的一種方法是維護類中所有實現(xiàn)類的列表,LoggerFactory代碼如下所示:

class LoggerFactory {
private static final List<LoggingOperation> instances = new ArrayList<>();

static {
instances.addAll(Arrays.asList(
new InMemoryLog(),
new FileLog(),
new DBLog(),
new RemoteServiceLog()
));
}

public static LoggingOperation getInstance(ApplicationContext context, String loggerMedium) {
for(LoggingOperation op : instances) {
// 比如判斷StrUtil.equals(loggerMedium, op.getType()) op本身添加一個type
}

return null;
}
}

但是請注意,還不夠,在所有上述實現(xiàn)中,無論if else、switch case? 還是上面的做法,都是讓存儲實現(xiàn)與LoggerFactory?緊密耦合的。你添加一種實現(xiàn),就要修改LoggerFactory,有什么更好的做法嗎?

逆向思維一下,我們是不是讓具體的實現(xiàn)主動注冊上來呢?通過這種方式,工廠不需要知道系統(tǒng)中有哪些實例可用,而是實例本身會注冊并且如果它們在系統(tǒng)中可用,工廠就會為它們提供服務。具體代碼如下:

class LoggerFactory {
private static final Map<String, LoggingOperation> instances = new HashMap<>();

public static void register(String loggerMedium, LoggingOperation instance) {
if (loggerMedium != null && instance != null) {
instances.put(loggerMedium, instance);
}
}

public static LoggingOperation getInstance(String loggerMedium) {
if (instances.containsKey(loggerMedium)) {
return instances.get(loggerMedium);
}
return null;
}
}

在這里,LoggerFactory?提供了一個register?注冊的方法,具體的存儲實現(xiàn)可以調(diào)用該方法注冊上來,保存在工廠的instancesmap對象中。

我們來看看具體的存儲實現(xiàn)注冊的代碼如下:

class RemoteServiceLog implements LoggingOperation {
static {
LoggerFactory.register("REMOTE", new RemoteServiceLog());
}

public void log(String message) {
// Implementation
}
}

由于注冊應該只發(fā)生一次,所以它發(fā)生在static類加載器加載存儲類時的塊中。

但是又有一個問題,默認情況下JVM不加載類RemoteServiceLog,除非它由應用程序在外部實例化或調(diào)用。因此,盡管存儲類有注冊的代碼,但實際上注冊并不會發(fā)生,因為沒有被JVM加載,不會調(diào)用static代碼塊中的代碼, 你又犯難了。

你靈機一動,LoggerFactory是獲取存儲實例的入口點,能否在這個類上做點文章,就寫下了下面的代碼:

class LoggerFactory {
private static final Map<String, LoggingOperation> instances = new HashMap<>();

static {
try {
loadClasses(LoggerFactory.class.getClassLoader(), "com.alvin.storage.impl");
} catch (Exception e) {
// log or throw exception.
}
}

public static void register(String loggerMedium, LoggingOperation instance) {
if (loggerMedium != null && instance != null) {
instances.put(loggerMedium, instance);
}
}

public static LoggingOperation getInstance(String loggerMedium) {
if (instances.containsKey(loggerMedium)) {
return instances.get(loggerMedium);
}
return null;
}

private static void loadClasses(ClassLoader cl, String packagePath) throws Exception {

String dottedPackage = packagePath.replaceAll("[/]", ".");

URL upackage = cl.getResource(packagePath);
URLConnection conn = upackage.openConnection();

String rr = IOUtils.toString(conn.getInputStream(), "UTF-8");

if (rr != null) {
String[] paths = rr.split("\n");

for (String p : paths) {
if (p.endsWith(".class")) {
Class.forName(dottedPackage + "." + p.substring(0, p.lastIndexOf('.')));
}

}
}
}
}

在上面的實現(xiàn)中,你使用了一個名為loadClasses?的方法,該方法掃描提供的包名稱com.alvin.storage.impl?并將駐留在該目錄中的所有類加載到類加載器。以這種方式,當類加載時,它們的static?塊被初始化并且它們將自己注冊到LoggerFactory中。

如何在 SpringBoot 中實現(xiàn)此技術(shù)?

你突然發(fā)現(xiàn)你的是springboot應用,突然想到有更方便的解決方案。

因為你的存儲實現(xiàn)類都被標記上注解@Component?,這樣 Spring? 會在應用程序啟動時自動加載類,它們會自行注冊,在這種情況下你不需要使用loadClasses?功能,Spring 會負責加載類。具體的代碼實現(xiàn)如下:

class LoggerFactory {
private static final Map<String, Class<? extends LoggingOperation>> instances = new HashMap<>();

public static void register(String loggerMedium, Class<? extends LoggingOperation> instance) {
if (loggerMedium != null && instance != null) {
instances.put(loggerMedium, instance);
}
}

public static LoggingOperation getInstance(ApplicationContext context, String loggerMedium) {
if (instances.containsKey(loggerMedium)) {
return context.getBean(instances.get(loggerMedium));
}
return null;
}
}

getInstance?需要傳入ApplicationContext對象,這樣就可以根據(jù)類型獲取具體的實現(xiàn)了。

修改所有存儲實現(xiàn)類,如下所示:

import org.springframework.stereotype.Component;

@Component
class RemoteServiceLog implements LoggingOperation {
static {
LoggerFactory.register("REMOTE", RemoteServiceLog.class);
}

public void log(String message) {
// Implementation
}
}

總結(jié)

我們通過一個例子,不斷迭代帶大家理解了工廠模式,工廠模式是一種創(chuàng)建型設(shè)計模式,用于創(chuàng)建同一類型的不同實現(xiàn)對象。我們來總結(jié)下這種動態(tài)選擇對象工廠模式的優(yōu)缺點。

優(yōu)點:

  • 容易管理。在添加新的存儲類時,只需將該類放入特定包中,在static代碼塊中注冊它自己到工廠中。
  • 松耦合,當您添加新的存儲實現(xiàn)時,您不需要在工廠類中進行任何更改。
  • 遵循SOLID編程原則。

缺點:

  • 如果是用原生通過類加載的方式,代價比較大,因為它涉及 I/O 操作。但是如果使用的是SpringBoot,則無需擔心,因為框架本身會調(diào)用組件。
  • 需要額外編寫一個static塊,注冊自己到工廠中,一不小心就遺漏了。
責任編輯:武曉燕 來源: JAVA旭陽
相關(guān)推薦

2021-03-06 22:50:58

設(shè)計模式抽象

2024-12-05 15:44:13

工廠模式接口

2011-11-17 16:03:05

Java工廠模式Clojure

2024-03-06 13:19:19

工廠模式Python函數(shù)

2020-08-21 07:23:50

工廠模式設(shè)計

2022-01-12 13:33:25

工廠模式設(shè)計

2020-07-09 08:00:25

Git分支模式

2021-09-29 13:53:17

抽象工廠模式

2020-10-19 09:28:00

抽象工廠模式

2009-01-15 10:55:29

JavaScript設(shè)計模式抽象工廠

2023-11-01 11:27:42

ping命令網(wǎng)絡(luò)

2023-07-27 06:51:46

Android架構(gòu)模式

2022-05-09 08:04:50

工廠模式設(shè)計模式

2010-04-19 09:30:00

工廠模式PHP設(shè)計模式

2025-01-06 13:00:00

RedisSentinel高可用模式

2024-07-31 08:12:33

2013-11-26 16:29:22

Android設(shè)計模式

2010-10-09 09:25:35

Python工廠模式

2009-08-04 09:22:26

C#工廠模式

2020-09-14 17:26:48

抽象工廠模式
點贊
收藏

51CTO技術(shù)棧公眾號

国产伦精品一区二区三区千人斩| 欧美xxx黑人xxx水蜜桃| 视频一区免费在线观看| x99av成人免费| 青娱乐国产精品视频| 国产第一页在线视频| 91麻豆福利精品推荐| 国产一区二区丝袜| 精品午夜福利视频| av亚洲在线观看| 日韩三级电影网址| 免费在线观看毛片网站| 大片免费在线观看| 久久久久久免费网| 成人资源视频网站免费| 波多野结衣电影在线播放| 欧美1级日本1级| 亚洲视频在线免费看| 色欲无码人妻久久精品| 国产在线精彩视频| 综合在线观看色| 明星裸体视频一区二区| 国产欧美综合视频| 日韩二区三区四区| 97精品一区二区三区| 午夜爽爽爽男女免费观看| 伊人久久大香线蕉无限次| 日韩欧美一级特黄在线播放| 国产av人人夜夜澡人人爽| 免费看电影在线| 亚洲欧美一区二区视频| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 美女撒尿一区二区三区| 国产免费看av| 加勒比色老久久爱综合网| 91精品国产综合久久久蜜臀粉嫩| 成人一区二区三| 妞干网免费在线视频| 一区二区在线观看免费视频播放| 婷婷四房综合激情五月| 欧美一区二区少妇| www.66久久| 国产高清精品一区二区| aa视频在线免费观看| 蜜桃视频一区二区| 国产精品久久久久久久7电影| www日韩精品| 亚洲人www| 韩剧1988免费观看全集| 国产精彩视频在线观看| 影音先锋久久久| 欧美激情视频在线免费观看 欧美视频免费一 | 国产综合视频在线| 国产乱人伦精品一区二区在线观看 | 国产午夜精品无码| 成人免费电影网址| 这里只有精品视频| 99精品中文字幕| 99久久.com| 中文字幕一精品亚洲无线一区| 亚洲成人黄色av| 国产精品一区二区av日韩在线 | 国精产品一区二区| 亚洲 精品 综合 精品 自拍| 91麻豆福利精品推荐| heyzo久久| 亚洲护士老师的毛茸茸最新章节| 无码国产精品一区二区免费式直播| 国产欧美88| 日韩亚洲电影在线| 高清中文字幕mv的电影| gogo久久日韩裸体艺术| 日韩电影视频免费| 欧美 日韩 国产 成人 在线观看| 国内精品视频在线观看| 色天天综合狠狠色| 久久久精品视频免费观看| 国产精品s色| 98精品国产高清在线xxxx天堂| 啦啦啦免费高清视频在线观看| 久久中文在线| 川上优av一区二区线观看| 成人av手机在线| 337p粉嫩大胆色噜噜噜噜亚洲| 日韩高清国产精品| 亚洲综合图区| 欧美日韩色婷婷| 亚洲综合日韩欧美| 超碰97成人| 亚洲一级免费视频| 欧美日韩免费一区二区| 一区二区91| 成人免费网站在线看| 丰满人妻妇伦又伦精品国产| 久久久久九九视频| 国产一级片91| 成人在线网站| 欧美哺乳videos| 国产精品av久久久久久无| 欧美日本一区| 国产精品青青在线观看爽香蕉| 国产极品999| 久久精品夜色噜噜亚洲a∨| 无码毛片aaa在线| 芒果视频成人app| 日韩一级二级三级| 中字幕一区二区三区乱码| 伊人久久大香线| 国产99久久久欧美黑人| 成人小说亚洲一区二区三区| 国产精品久久久久久久久免费丝袜| 国产一级做a爰片久久毛片男| 四虎4545www精品视频| 精品国产91久久久久久久妲己| 欧美xxxx精品| 久久精品导航| 国产精品手机在线| 成人在线播放免费观看| 在线观看网站黄不卡| 成年人的黄色片| 欧美日韩国产一区精品一区| 国产精品视频精品| 毛片在线能看| 偷窥国产亚洲免费视频| 性生交大片免费看l| 日韩精品一区二区三区免费观看| 7m精品福利视频导航| 精品久久久久成人码免费动漫| 国产精品区一区二区三| 国产极品美女高潮无套久久久| 免费日韩一区二区三区| 欧美高清视频在线观看| 国产一区二区三区视频免费观看| 国产人成一区二区三区影院| 女性女同性aⅴ免费观女性恋| 成人高潮a毛片免费观看网站| 久久成人18免费网站| 亚洲综合精品视频| 国产欧美精品一区二区三区四区| 国产a级一级片| 午夜精品福利影院| 91成人天堂久久成人| 天天爱天天干天天操| 亚洲午夜一区二区| 无码人妻精品一区二区三| 亚洲国产激情| 国产免费一区| av在线最新| 亚洲国产精品美女| 91av在线免费视频| www久久精品| 国产男女激情视频| 欧美日韩国产高清电影| 国产精品一区二区久久| 欧美性天天影视| 91精品国产91综合久久蜜臀| 精品人妻伦九区久久aaa片| 精品亚洲成a人| 看一级黄色录像| 91国内精品| 5566日本婷婷色中文字幕97| 深夜福利在线视频| 色丁香久综合在线久综合在线观看 | 九九热这里有精品| 久久久久www| 亚洲av综合色区无码一二三区| 亚洲高清不卡在线观看| 中文字幕 亚洲一区| 久久综合婷婷| 日本特级黄色大片| 1769国产精品视频| 欧美一区二区三区精品电影| 国产三级视频在线| 91麻豆精品国产综合久久久久久| www.av视频| 99久久国产免费看| 亚洲一二三区av| 欧美在线高清| 久久久久久久久一区| 99久久精品一区二区成人| 久久久精品在线| 亚州男人的天堂| 欧美理论片在线| 久久精品国产亚洲AV无码麻豆| 91丨porny丨国产| 国产无遮挡猛进猛出免费软件| 国产精品s色| 日本精品一区二区三区高清 久久| 久久免费影院| 性色av一区二区三区在线观看| h网站在线免费观看| 日韩欧美美女一区二区三区| 久久久久99精品成人片三人毛片| 国产精品家庭影院| 色哟哟无码精品一区二区三区| 日韩专区中文字幕一区二区| 欧美大片免费播放| 久久99国产精一区二区三区| 91一区二区三区| av一区在线| 久久久久久久久国产| av国产在线观看| 亚洲精品乱码久久久久久金桔影视 | 国产v日韩v欧美v| 最好看的2019年中文视频| 日批视频免费播放| 欧美电影一区二区| 特级西西444www大精品视频免费看| 中文字幕亚洲一区二区va在线| 欧美成人三级伦在线观看| 狠狠色丁香久久婷婷综| 日韩在线xxx| 99国产一区| www.-级毛片线天内射视视| 亚洲系列另类av| 国产精品区一区二区三含羞草| 日韩精品第二页| 国产大片精品免费永久看nba| 国产探花在线观看| 久久av.com| 麻豆视频在线观看免费| 国产亚洲欧美一区| 三级在线视频| 欧美变态tickle挠乳网站| 国产精品老熟女视频一区二区| 色老综合老女人久久久| 国产成人无码精品久在线观看| 亚洲免费在线视频一区 二区| 免费看的黄色网| 久久久精品黄色| 欧美图片一区二区| 国产jizzjizz一区二区| 亚洲国产欧美91| 国产综合色在线| 91aaa精品| 极品少妇一区二区三区精品视频 | 国产视频在线观看网站| 99tv成人| 亚洲一区二区三区四区中文| 不卡一区2区| 亚洲ai欧洲av| 欧美伦理影院| 亚洲一卡二卡三卡| 色777狠狠狠综合伊人| 亚洲精品国产精品久久| 成人激情免费视频| 亚洲成人午夜在线| 日韩精品首页| 日韩人妻一区二区三区蜜桃视频| 亚洲成人一区| 国产精品av免费观看| 欧美性色综合| 国产免费观看高清视频| 免费在线观看成人av| 午夜精品久久久内射近拍高清| 丝袜美腿一区二区三区| 日本爱爱免费视频| 久久国产精品99精品国产| 精品人妻一区二区三| 成人av在线电影| 亚洲成人av免费在线观看| 2021久久国产精品不只是精品| 欧美成人国产精品一区二区| 国产精品蜜臀在线观看| 四虎免费在线视频| 亚洲va欧美va人人爽午夜| 亚洲s码欧洲m码国产av| 在线精品视频一区二区三四| 一级全黄少妇性色生活片| 欧美一二三区在线观看| 天天综合永久入口| 伊人精品在线观看| av免费在线免费| 91黑丝高跟在线| 国产资源一区| 国产精品欧美久久| 成人羞羞网站入口免费| 欧美日韩dvd| 在线视频亚洲| 天堂在线中文在线| 成人18视频日本| 一区二区三区在线观看免费视频| 亚洲欧美一区二区久久 | 欧美色综合网站| 精品人妻无码一区二区三区蜜桃一| 亚洲高清久久网| lutube成人福利在线观看| 欧美激情国产高清| 欧美xnxx| 国产亚洲福利社区| 久久精品高清| 免费国产a级片| 久久99九九99精品| 色婷婷精品久久二区二区密| 国产精品素人一区二区| 成年人午夜视频| 欧美另类高清zo欧美| 四虎在线观看| 欧美另类第一页| 精品日韩视频| 国产伦精品一区二区三区在线 | 粗暴91大变态调教| 国产精一品亚洲二区在线视频| www.色天使| 亚洲成人午夜电影| 国产精品国产精品国产专区| 亚洲欧洲高清在线| xxxx在线视频| 成人性生交大片免费看视频直播| 天堂99x99es久久精品免费| 日本在线视频www色| 日韩高清不卡一区二区| 97人妻天天摸天天爽天天| 樱花草国产18久久久久| 亚洲特级黄色片| 亚洲久久久久久久久久| ririsao久久精品一区| 国产精品欧美激情在线播放| 亚洲成人一品| 3d动漫一区二区三区| 国产69精品久久777的优势| 麻豆一区在线观看| 欧美怡红院视频| 免费观看成年在线视频网站| 国内精品久久久久久久久| 亚洲成人偷拍| 欧美与动交zoz0z| 极品少妇一区二区三区精品视频 | 9.1在线观看免费| 亚洲人成网站影音先锋播放| 中文字幕在线观看精品| 亚洲视频一区二区| 桃花岛tv亚洲品质| 欧美另类视频在线| 国产精品久久久一区二区| 国产伦精品一区二区三区精品| 亚洲自拍欧美精品| www.色视频| 欧美黑人巨大xxx极品| 秋霞影院一区| 日本美女爱爱视频| 国产成人久久精品77777最新版本| 国语对白在线播放| 欧美一级片在线| 污视频在线看网站| av在线不卡观看| 激情欧美丁香| 玖玖爱在线精品视频| 天天av天天翘天天综合网色鬼国产 | 自拍偷拍99| 国产精品综合一区二区| 多男操一女视频| 欧美一区二区三区免费视频| 自拍亚洲图区| 国产伦精品一区二区三区照片| 国产欧美日韩综合一区在线播放| 亚洲AV无码国产精品| 色菇凉天天综合网| 免费在线观看av| 91精品国产高清久久久久久91裸体| 欧美激情四色| 粉嫩av懂色av蜜臀av分享| 日韩欧美在线一区| av影片在线看| 亚洲精品欧美极品| 国内精品久久久久国产盗摄免费观看完整版| 免费在线观看日韩av| 欧美日韩国产精品| 成人亚洲综合天堂| 成人午夜在线观看| 亚洲国产高清一区二区三区| 蜜桃av免费看| 91麻豆精品国产自产在线 | 国产精品久久久亚洲| 99久久精品费精品国产风间由美 | 国产又粗又猛又爽| 欧美激情图片区| 国产一区三区在线播放| 天天久久综合网| 色综合久久久久久久| 91精彩视频在线播放| 国产91精品入口17c| 久久婷婷久久| 欧美黄色aaa| 精品亚洲国产视频| 97精品资源在线观看| 国产成人精品视频免费看| 国产精品久久国产精麻豆99网站| 国模无码一区二区三区| 国产精品日韩电影| 精品不卡视频| 农村老熟妇乱子伦视频| 亚洲精品一区二区三区在线观看 | 国产伦理一区二区三区| 石原莉奈在线亚洲二区| 久久精品www| 伊人久久免费视频| 牛牛影视久久网| 亚洲一区二区偷拍| 色婷婷精品大视频在线蜜桃视频|