• <menu id="gyiem"><menu id="gyiem"></menu></menu>
  • <menu id="gyiem"><code id="gyiem"></code></menu>

    Java設計模式(一) 簡單工廠模式不簡單

    原創文章,轉載請務必將下面這段話置于文章開頭處(保留超鏈接)。
    本文轉發自技術世界原文鏈接 http://www.luozeyang.com/design_pattern/simple_factory

    簡單工廠模式使用案例

    有一種抽象產品——汽車(Car),同時有多種具體的子類產品,如BenzCar,BMWCar,LandRoverCar。類圖如下
    Product class diagram

    作為司機,如果要開其中一種車,比如BenzCar,最直接的做法是直接創建BenzCar的實例,并執行其drive方法,如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package com.jasongj.client;

    import com.jasongj.product.BenzCar;

    public class Driver1 {

    public static void main(String[] args) {
    BenzCar car = new BenzCar();
    car.drive();
    }

    }

    此時如果要改為開Land Rover,則需要修改代碼,創建Land Rover的實例并執行其drive方法。這也就意味著任何時候需要換一輛車開的時候,都必須修改客戶端代碼。

    一種稍微好點的方法是,通過讀取配置文件,獲取需要開的車,然后創建相應的實例并由父類Car的引用指向它,利用多態執行不同車的drive方法。如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package com.jasongj.client;

    import org.apache.commons.configuration.ConfigurationException;
    import org.apache.commons.configuration.XMLConfiguration;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import com.jasongj.product.BMWCar;
    import com.jasongj.product.BenzCar;
    import com.jasongj.product.Car;
    import com.jasongj.product.LandRoverCar;

    public class Driver2 {

    private static final Logger LOG = LoggerFactory.getLogger(Driver2.class);

    public static void main(String[] args) throws ConfigurationException {
    XMLConfiguration config = new XMLConfiguration("car.xml");
    String name = config.getString("driver2.name");
    Car car;

    switch (name) {
    case "Land Rover":
    car = new LandRoverCar();
    break;
    case "BMW":
    car = new BMWCar();
    break;
    case "Benz":
    car = new BenzCar();
    break;
    default:
    car = null;
    break;
    }
    LOG.info("Created car name is {}", name);
    car.drive();
    }

    }

    對于Car的使用方而言,只需要通過參數即可指定所需要Car的各類并得到其實例,同時無論使用哪種Car,都不需要修改后續對Car的操作。至此,簡單工廠模式的原型已經形成。如果把上述的邏輯判斷封裝到一個專門的類的靜態方法中,則實現了簡單工廠模式。工廠代碼如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package com.jasongj.factory;

    import org.apache.commons.configuration.ConfigurationException;
    import org.apache.commons.configuration.XMLConfiguration;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import com.jasongj.product.BMWCar;
    import com.jasongj.product.BenzCar;
    import com.jasongj.product.Car;
    import com.jasongj.product.LandRoverCar;

    public class CarFactory1 {

    private static final Logger LOG = LoggerFactory.getLogger(CarFactory1.class);

    public static Car newCar() {
    Car car = null;
    String name = null;
    try {
    XMLConfiguration config = new XMLConfiguration("car.xml");
    name = config.getString("factory1.name");
    } catch (ConfigurationException ex) {
    LOG.error("parse xml configuration file failed", ex);
    }

    switch (name) {
    case "Land Rover":
    car = new LandRoverCar();
    break;
    case "BMW":
    car = new BMWCar();
    break;
    case "Benz":
    car = new BenzCar();
    break;
    default:
    car = null;
    break;
    }
    LOG.info("Created car name is {}", name);
    return car;
    }

    }

    調用方代碼如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package com.jasongj.client;

    import com.jasongj.factory.CarFactory1;
    import com.jasongj.product.Car;

    public class Driver3 {

    public static void main(String[] args) {
    Car car = CarFactory1.newCar();
    car.drive();
    }

    }

    與Driver2相比,所有的判斷邏輯都封裝在工廠(CarFactory1)當中,Driver3不再需要關心Car的實例化,實現了對象的創建和使用的隔離。

    當然,簡單工廠模式并不要求一定要讀配置文件來決定實例化哪個類,可以把參數作為工廠靜態方法的參數傳入。

    簡單工廠模式進階

    使用反射實現擴展性

    從Driver2和CarFactory1的實現中可以看到,當有新的車加入時,需要更新Driver2和CarFactory1的代碼也實現對新車的支持。這就違反了開閉原則(Open-Close Principle)。可以利用反射(Reflection)解決該問題。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package com.jasongj.factory;

    import org.apache.commons.configuration.ConfigurationException;
    import org.apache.commons.configuration.XMLConfiguration;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import com.jasongj.product.Car;

    public class CarFactory2 {

    private static final Logger LOG = LoggerFactory.getLogger(CarFactory2.class);

    public static Car newCar() {
    Car car = null;
    String name = null;
    try {
    XMLConfiguration config = new XMLConfiguration("car.xml");
    name = config.getString("factory2.class");
    } catch (ConfigurationException ex) {
    LOG.error("Parsing xml configuration file failed", ex);
    }

    try {
    car = (Car)Class.forName(name).newInstance();
    LOG.info("Created car class name is {}", name);
    } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
    LOG.error("Instantiate car {} failed", name);
    }
    return car;
    }

    }

    從上面代碼中可以看到,之后如果需要引入新的Car,只需要在配置文件中指定該Car的完整類名(包括package名),CarFactory2即可通過反射將其實例化。實現了對擴展的開放,同時保證了對修改的關閉。熟悉Spring的讀者應該會想到Spring IoC的實現。

    注解讓簡單工廠模式不簡單

    上例中使用反射做到了對擴展開放,對修改關閉。但有些時候,使用類的全名不太方便,使用別名會更合適。例如Spring中每個Bean都會有個ID,引用Bean時也會通過ID去引用。像Apache Nifi這樣的數據流工具,在流程上使用了職責鏈模式,而對于單個Processor的創建則使用了工廠,對于用戶自定義的Processor并不需要通過代碼去注冊,而是使用注解(為了更方便理解下面這段代碼,請先閱讀筆者另外一篇文章《Java系列(一)Annotation(注解)》)。

    下面就繼續在上文案例的基礎上使用注解升級簡單工廠模式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package com.jasongj.factory;

    import java.util.Collections;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.ConcurrentHashMap;

    import org.apache.commons.configuration.ConfigurationException;
    import org.apache.commons.configuration.XMLConfiguration;
    import org.reflections.Reflections;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import com.jasongj.annotation.Vehicle;
    import com.jasongj.product.Car;

    public class CarFactory3 {

    private static final Logger LOG = LoggerFactory.getLogger(CarFactory3.class);

    private static Map<String, Class> allCars;

    static {
    Reflections reflections = new Reflections("com.jasongj.product");
    Set<Class<?>> annotatedClasses = reflections.getTypesAnnotatedWith(Vehicle.class);
    allCars = new ConcurrentHashMap<String, Class>();
    for (Class<?> classObject : annotatedClasses) {
    Vehicle vehicle = (Vehicle) classObject.getAnnotation(Vehicle.class);
    allCars.put(vehicle.type(), classObject);
    }
    allCars = Collections.unmodifiableMap(allCars);
    }

    public static Car newCar() {
    Car car = null;
    String type = null;
    try {
    XMLConfiguration config = new XMLConfiguration("car.xml");
    type = config.getString("factory3.type");
    LOG.info("car type is {}", type);
    } catch (ConfigurationException ex) {
    LOG.error("Parsing xml configuration file failed", ex);
    }

    if (allCars.containsKey(type)) {
    LOG.info("created car type is {}", type);
    try {
    car = (Car) allCars.get(type).newInstance();
    } catch (InstantiationException | IllegalAccessException ex) {
    LOG.error("Instantiate car failed", ex);
    }
    } else {
    LOG.error("specified car type {} does not exist", type);
    }
    return car;
    }

    }

    從上面代碼中可以看到,該工廠會掃描所有被Vehicle注解的Car(每種Car都在注解中聲明了自己的type,可作為該種Car的別名)然后建立起Car別名與具體Car的Class原映射。此時工廠的靜態方法即可根據目標別名實例化對應的Car。

    本文所有代碼都可從作者GitHub下載.

    簡單工廠模式詳解

    簡單工廠模式定義

    簡單工廠模式(Simple Factory Pattern)又叫靜態工廠方法模式(Static FactoryMethod Pattern)。專門定義一個類(如上文中的CarFactory1、CarFactory2、CarFactory3)來負責創建其它類的實例,由它來決定實例化哪個具體類,從而避免了在客戶端代碼中顯式指定,實現了解耦。該類由于可以創建同一抽象類(或接口)下的不同子類對象,就像一個工廠一樣,因此被稱為工廠類。

    簡單工廠模式類圖

    簡單工廠模式類圖如下所示
    Simple factory pettern class diagram

    簡單工廠模式角色劃分

    • 工廠角色(如上文中的CarFactory1/2/3):這是簡單工廠模式的核心,由它負責創建所有的類的內部邏輯。當然工廠類必須能夠被外界調用,創建所需要的產品對象。一般而言,工廠類提供一個靜態方法,外部程序通過該方法創建所需對象。
    • 抽象產品角色(如上文中的Car):簡單工廠模式所創建的是所有對象的父類。注意,這里的父類可以是接口也可以是抽象類,它負責描述所創建實例共有的公共接口。
    • 具體產品角色(如上文中的BMWCar,BenzCar,LandRoverCar):簡單工廠所創建的具體實例對象,這些具體的產品往往都擁有共同的父類。

    簡單工廠模式優點

    • 工廠類是整個簡單工廠模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的信息(配置,或者參數),決定究竟應該創建哪個具體類的對象。用戶在使用時可以直接根據工廠類去創建所需的實例,而無需了解這些對象是如何創建以及如何組織的。有利于整個軟件體系結構的優化。
    • 通過引入配置文件和反射,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性(如CarFactory2)。
    • 客戶端無須知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數即可,對于一些復雜的類名,通過簡單工廠模式可以減少使用者的記憶量(如CarFactory3)。

    簡單工廠模式缺點

    • 由于工廠類集中了所有實例的創建邏輯,這就直接導致一旦這個工廠出了問題,所有的客戶端都會受到牽連。
    • 由于簡單工廠模式的產品是基于一個共同的抽象類或者接口,這樣一來,產品的種類增加的時候,即有不同的產品接口或者抽象類的時候,工廠類就需要判斷何時創建何種接口的產品,這就和創建何種種類的產品相互混淆在了一起,違背了單一職責原則,導致系統喪失靈活性和可維護性。
    • 正如上文提到的,一般情況下(如CarFactory1),簡單工廠模式違背了“開放-關閉原則”,因為當我們新增加一個產品的時候必須修改工廠類,相應的工廠類就需要重新編譯一遍。但這一點可以利用反射(CarFactory3在本質上也是利用反射)在一定程度上解決(如CarFactory2)。
    • 使用反射可以使簡單工廠在一定條件下滿足“開放-關閉原則”,但這僅限于產品類的構造及初始化相同的場景。對于各產品實例化或者初始化不同的場景,很難利用反射滿足“開放-關閉”原則。
    • 簡單工廠模式由于使用了靜態工廠方法,造成工廠角色無法形成基于繼承的等級結構。這一點筆者持保留態度,因為繼承不是目的,如果沒有這樣的需求,這一點完全不算缺點,例如JDBC的DriverManager。

    簡單工廠模式與OOP原則

    已遵循的原則

    • 依賴倒置原則
    • 迪米特法則
    • 里氏替換原則
    • 接口隔離原則

    未遵循的原則

    • 開閉原則(如上文所述,利用配置文件+反射或者注解可以避免這一點)
    • 單一職責原則(工廠類即要負責邏輯判斷又要負責實例創建)

    簡單工廠模式在JDK中的典型應用

    簡單工廠模式在JDK中最典型的應用要數JDBC了。可以把關系型數據庫認為是一種抽象產品,各廠商提供的具體關系型數據庫(MySQL,PostgreSQL,Oracle)則是具體產品。DriverManager是工廠類。應用程序通過JDBC接口使用關系型數據庫時,并不需要關心具體使用的是哪種數據庫,而直接使用DriverManager的靜態方法去得到該數據庫的Connection。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package com.jasongj.client;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    public class JDBC {

    private static final Logger LOG = LoggerFactory.getLogger(JDBC.class);

    public static void main(String[] args) {
    Connection conn = null;
    try {
    Class.forName("org.apache.hive.jdbc.HiveDriver");
    conn = DriverManager.getConnection("jdbc:hive2://127.0.0.1:10000/default");
    PreparedStatement ps = conn.prepareStatement("select count(*) from test.test");
    ps.execute();
    } catch (SQLException ex) {
    LOG.warn("Execute query failed", ex);
    } catch(ClassNotFoundException e) {
    LOG.warn("Load Hive driver failed", e);
    } finally {
    if(conn != null ){
    try {
    conn.close();
    } catch (SQLException e) {
    // NO-OPT
    }
    }
    }
    }
    }

    Java設計模式系列

    郭俊 Jason wechat
    歡迎關注作者微信公眾號【大數據架構】
    您的贊賞將支持作者繼續原創分享
    速赢彩app www.38yy.com | www.490034.com | 2349014.com | www.539suncity.com | www.163770.com | www.7168805.com | 1483yy.com | www.870000.com | w9621.com | www.xpj2008.co | feicai0598.com | www.63606g.com | f86226.com | www.8582cc.com | 992222j.com | www.2109b.com | 1259g.com | www.397477.com | www.hai6666.com | 6146a.com | www.02272.com | 1591ooo.com | www.xpj228888.com | 11005t.com | www.7933.com | www.81866x.com | www.356036.com | www.644577.com | 0270098.com | www.69989c.com | 4488j.com | www.9928d.com | www.4107o.com | 697138.com | www.c44xx.com | 7599pp.com | www.9187n.com | 777818b.com | www.04czj.com | www.56520z.com | 01885p.com | www.t32939.com | 3552p.com | www.09czj.com | www.026319.com | 01234ggg.com | www.383335.com | 99151f.com | www.160881.com | www.v948v.com | yhyunnan.vip | www.77114l.com | www.8124h.com | 80850bb.com | www.u32939.com | nn4255.com | www.ascp00.com | www.3311sb.com | 4546vip8.com | www.6482x.com | www.86611g.com | 333235.com | www.00778e.com | 0245u.com | www.375916.com | www.20199nn.com | lc99vip.com | www.9155d.com | www.370011.com | 668668.am | www.8d818.com | www.8694t.com | 3mgmooo.com | www.7737bb.com | www.11105.tv | 661070.com | www.cp1518.com | www.js46123.com | 4880r.com | www.ylylc03.com | www.ydb44.com | 55331bb.com | www.js18683.com | www.9785888.com | 1347.com | www.33588d.com | www.007733.com | 1036878.com | www.53536.cc | www.11kj.com | 56787cc.com | www.296676.com | www.57800p.com | 2418a.com | c89qe65.com | www.0343g.com | www.n32126.cc | 2776.com | www.9818j.cc | www.888msb.com | wdlywz.com | www.236844.com | www.35252h.com | 55115156.com | blr81.com | www.9818w.cc | www.jsc9558.com | 84494433.com | 996622oo.com | www.jzvip33.com | www.pj038888.com | cc67890.com | www.183209.com | www.60886b.com | www.282xpj.com | 1624ff.com | www.99jtc.com | www.hjcp22.com | 66772007.com | sha145.com | www.66332t.com | www.70389.com | 8030q.com | 40661113.com | www.54591.com | www.xj666i.com | feicai0437.com | 5004v.com | www.32123s.com | www.1818365.com | 8036cc.com | 444000hh.com | www.912193.com | www.bwinyz31.com | www.14086622.com | 28839v.com | 771906.com | www.759126.com | www.87849.com | vv9798.com | 94111.com | www.526051.com | www.4625.am | www.3353k.com | 62222k.com | 518cp-9.com | www.hx2088.com | www.5517.com | www.408409.com | 2709s.com | 9101903.com | www.341977.com | www.033064.com | www.dw8844.com | www.45601.com | o8009.com | www.80065a.com | www.550021l.com | www.1168r.com | www.wnsr038.com | 4018nn.com | 70118w.com | www.c6186.com | www.ag3344.com | www.279765.com | 8557a.com | 3863.com | 36518.info | www.88065c.com | www.19019y.com | www.655666a.com | 50099w.com | hhgz1144.com | 8827rr.com | www.6939n.com | www.808888d.com | www.7025x.com | blhvip15.com | 0003890.com | 7774661.com | www.562601.com | www.ya2019l.com | www.97060f.com | www.a32126.cc | 1591fff.com | 4488aaa.com | 7726yyy.com | www.505162.com | www.99788r.com | www.d80288.com | www.xz1088.com | www.n32126.cc | 3365.com | 69446600.com | 6423l.com | www.207881.com | www.080wy.com | www.37377o.com | www.472706.com | www.354488.com | www.76060u.com | 08530007.com | 4231b.com | 859636.com | 7737.com | 29918c.com | www.781253.com | 56988s.com | 52599h.com | www.660686.com | www.60108d.com | www.068633.com | www.0012737.com | www.597567d.com | www.32666h.com | www.6868xj.com | 6830p.com | yy01234.com | 4323s.com | hg7078.biz | ly88888883.com | www.701514.com | www.21202d.com | www.37377q.com | www.8080999f.com | www.88166d.com | www.8yw.net | www.435511.com | www.md005.com | 5804j.com | 2306r.com | j99345.am | 3388777.com | 4107m.com | 7722209.com | 54443b.com | 86811w.com | 66876s.com | www.040423.com | www.562601.com | www.788572.com | www.hm5333.com | www.5091z.com | www.49956p.com | www.60007x.com | www.208339.com | www.065915.com | www.77424.com | www.087w.com | www.55676b.com | www.184088.com | www.y6098.com | www.3337795.com | www.62979g.com | www.y8863.com | www.xj6007.com | www.88325y.com | www.411559.com | www.47506p.com | www.79095x.com | www.44118z.com | www.8905x.com | www.48330b.com | www.954321n.com | www.hd5388.com | www.39500j.com | www.2408d.com | www.hx1165.com | www.890413.com | www.781253.com | www.682918.com | www.514211.com | www.140599.com | www.50064a.com | 0033d.cc | 9479a6.com | 1596.com | 7686m.com | 4340o.com | 33002007.com | 111122yy.com | www.76060l.com | www.36410.com | www.zs5588.com | www.suncity3.com | www.00773w.com | www.634505.hk | www.9989572.com | www.88266q.com | www.004ac.com | www.493306.com | www.41518a.com | 9h2.com | 4477634.com | 7893w8.com | dd01234.com | 26444m.com | www.hg9093.com | www.4880d.com | www.42842818.com | www.1851119.com | www.qiji666.com | www.33112s.com | www.902271.com | www.178387.com | 45637u.com | 449649.com | 11bb8332.com | www.030xpj.com | www.hg50668.com | www.0816msc.com | www.91779t.com | www.704wb.com | www.938901.com | 6hcc22.com | 1654j.com | hg873.com | 97297k.com | www.pj9723.com | www.tc1158.com | www.55676t.com | www.cll168.com | www.178135.com | 55995004.com | 50067c.com | www.jjj5025.com | www.6778msc.com | www.97994b.com | www.0014y.com | www.71399o.com | bcbm688.com | 99589ff.net | www.6868xj.com | www.8000hm.com | www.312615.com | www.5522v.cc | 00054066.com | bc495.com | 77335156.com | www.998664.com | www.574546.com | www.509866.com | w0000.vip | 9737dd.me | lswjs4399.com | www.92msc.com | www.i32031.com | www.060wy.com | 0033l.cc | 35222g.com | www.653507.com | www.1168b.com | www.pujing95.com | www.223559.com | 8899vn77.com | qmbfw.com | www.tmx6872.com | www.89777c.com | www.440343.com | t365f.com | xpj70065.com | www.618msc.com | www.pj56l.com | www.188975.com | 8015z.com | www.0999js.com | www.j948j.com | www.4323e.com | www.43818i.com | 4466buyu.com | www.777444r.com | www.2776.cc | www.hm5333.com | 78112211.com | 8905.com | www.9999d.com | www.29178c.com | 47749a.com | haobocaiwang.net | www.hk6655.com | www.0270z.com | 1665ll.com | j58955.com | www.am5599.com | www.37377z.com | www.33588i.com | 6487sss.com | www.0055js.com | www.35898e.com | www.43818e.com | 35222w.com | www.jing6664.com | www.115107.com | 28837711.com | 6789801.com | www.a98886.com | www.15355g.com | 61789q.com | zg163.net | www.515973.com | www.903029.com | 1596c.com | www.alpkylc.com | www.23819.am | www.29178e.com | 25288a.com | www.2302325.com | www.022qh.cc | aaa2267.com | www.r22365.com | www.hg274.com | 86811j.com | 83086h.com | www.ac775.com | www.846662.com | 5504j.com | www.xj4466.com | www.120782.com | 2229.cc | www.a3a000.cc | www.w84z.com | 73055f.com | 5443v.com | www.s69096.com | www.djcp004.com | qq365y.com | www.9418cp.com | www.599399.com | b61653.com | www.hyl8.com | www.514211.com | 73055q.com | www.331194.com | www.547377.com | be9458.com | www.288988c.com | www.477680.com | r62365.com | www.bwinyz32.com | c388.com | www.pj90666.com | www.win1238.com | bcylc88.com | www.7025z.com | www.81520f.com | 61328899.com | www.88854.com | www.760250.com | x7570xx.com | www.5981y.com | 520666.com | 670.cc | www.89777c.com | 13862tt.com | www.hg94777.com | www.451.cc | hj1234.com | www.4963ww.com | 4379t.com | www.m1977.com | www.wd05.cc | xh9.com | www.178222a.com | www.342177.com | tt3189.com | www.1466p.com | hg12020.com | www.564949.com | www.289379.com | 1079.cc | www.2118037.com | 69447733.com | www.50021.com | b5313.com | www.wnsr818.com | www.22030.cc | vipy15.com | www.1011777.com | 0015rr.com | www.6008876.com | www.592771.com | 463.am | www.90305d.com | 23599x.com | www.hg6668.tv | 61789w.com | www.hg9948.com | www.369071.com | www.xpj8888.cc | www.00665c.com | 70118f.com | www.8577b.cc | 52520524.com | www.848777b.com | 131xxx.net | www.872878.com | www.178261.com | www.bet3650714.com | www.022gs.cc | 500000477.com | www.120158.com | 8742u.com | www.56011e.com | 12274444.com | www.ldz333.com | ylg2001.com | www.ww55826.com | 22296tt.com | www.jbb08.net | 9645ss.com | www.47272x.com | www.235925.com | www.365815k.com | www.669308.com | www.8124y.com | www.933771.com | 463.am | www.44ckb.com | 26444o.com | www.39391.cc | 518cp6.com | www.9149k.com | qycp03.com | www.6364i.com | 3169t.com | www.5522y.cc | 6175n.com | www.627012.com | www.4759aa.com | www.868955.com | www.38200c.com | www.677038.com | www.w7w7.com | www.340680.com | www.142351.com | 93996.com | www.vns1033.com | 12742c.com | www.50999m.com | 7003vv.com | www.6687n.com | 4136g.com | www.89777f.com | dzc02.com | www.29178g.com | bet3659092.com | www.880686.com | www.365815c.com | www.81233e.com | www.89790.com | 33313q.com | www.89677u.com | 37111m.com | www.89777m.com | 7141ii.com | www.bxcp3333.com | www.56520k.com | 5099ss.com | www.agcpw.com | 3559666.cc | www.3398733.com | 9694z.com | www.5109.cc | www.809990.com | 8036xx.com | www.500710.com | 55aa8332.com | www.cp8014.cc | www.xin888111.com | 23800u.com | www.h948h.com | ooo0022.com | www.9192666.com | 6363yy.com | www.515663.com | www.99498.com | 8538y.com | www.81608u.com | 2381xx.com | www.593411.com | www.105353.com | 08702004.com | www.ylylc02.com | 1654.com | P35bb.com | www.7415vv.com | 78115577.com | www.cpkk6.com | www.j8998.com | 118888d.com | www.hg7833.com | 2613b.com | www.330892.com | www.lefa3333.com | 0805q.com | www.43818.com | www.77537q.com | 3550f.com | www.97994c.com | 518cp0.com | www.178339.com | www.99393.com | 38850011.com | www.904820.com | www.797008.com | 9479d4.com | www.16878w.com | www.15048e.com | 1463d.com | www.99788s.com | www.u22365.com | 2776j.com | www.vn888678.cc | www.4763111.com | feicai0453.com | www.0022sun.com | 1389aa.com | 0166b.com | www.60886x.com | amjzh.top | 31435544.com | www.78680e.com | www.81866l.com | 6641v.com | www.1434i.com | www.38200m.com | 4025v.com | www.7239w.com | www.345sbet.com | 5647t.com | www.9205g.com | www.hg8069.com | 4025q.com | www.926576.com | www.6a222.com | 11oo8331.com | www.068639.com | www.458633.com | www.bmw555888.com | n5429.com | www.688202.com | www.hg0799.com | 53166s.com | www.922873.com | www.808888i.com | 76543m.com | 22296yy.com | www.2418001.com | www.11008016.com | 75991m.com | www.576734.com | www.bwinyz41.com | www.68666g.com | z7454.com | www.5555y.cc | www.a9478.com | 30006b.com | 1977xpj.com | www.96386j.com | www.330246.com | wnsr8829.com | 1213iii.com | www.hb598.net | www.yh8426.com | 1294x.com | 99988807.com | www.ej158.com | www.395599.com | 28288q.com | 98982325.com | www.98528h.com | www.1880204.com | feicai0477.com | wfcp111888.com | www.5086u.com | www.8967j.com | www.tyc163.com | 30019v.com | www.809216.com | www.659618.com | www.fh6000.com | 66671r.com | m88bc.com | www.66332y.com | www.56655q.com | 33313s.com | 8036m.com | www.525059.com | www.bet686.com | www.jyd900.com | 20556655.com | 61789r.com | www.976500.com | www.4521j.com | www.7736l.cc | 88851g.com | bs223344.com | www.c1359.com | www.9895h.com | www.0241mmm.com | tzvip2024.com | bwin68888.net | www.810716.com | www.9187b.com | www.889966.com | le888w.com | 2709m.com | www.60007o.com | www.61233n.com | www.i32939.com | www.7830v.com | 3616444.com | 287711.com | www.506752.com | www.js02349.com | www.20199zz.com | www.8494j.com | 365-818.com | 50024499.com | www.500763.com | www.c773776.com | www.hg173c.com | www.09569b.com | 2jsfff.com | 9506z.com | www.52072q.com | www.3416o.com | www.44118l.com | www.qhxl.com | www.www-866766.com | 88851r.com | ylg2001.com | www.33112i.com | www.66ffz.com | www.h36599.com | www.g456x.com | www.vvww.6693005.com | wp16777.com | 82509.com | sxpj62908.com | www.587989.com | www.87668k.com | www.4521n.com | www.759696.com | www.7893w43.com | 5589h.com | 4508vv.com | 8159c.cc | www.35155u.com | www.rcw678.com | www.89777f.com | www.1851114.com | www.988300.com | www.zzzz0263.com | 6830q.com | 22113m.com | 30019rr.com | 1429w.com | www.luck878.com | www.779zf.com | www.4331f.com | www.005469.com | www.k00444.com | www.js3838.com | www.bmw0055.com | 4131.vip | 7736p.com | 1919394.com | 61328844.com | 0600x.cc | www.309388.com | www.fh7557.com | www.81233m.com | www.68365z.com | www.38138l.com | www.c668ln.com | www.js00369.com | www.cr666.com | 2hg7788.com | 392568.com | 86811f.com | 39199i.com | 0616.com | yun999.com | 1466z.com | 3121q.com | www.80075a.com | www.555446.com | www.csgc2.com | www.33598x.com | www.jzvip22.com | www.798345.com | www.180092.com | www.4058b.com | www.5099gg.com | www.hf7799.com | www.500994.com | www.03688.com | www.25288v.com | www.pu15.com | www.h7444.com | www.hg3028.com | 2003.com | 79964l.com | 2851r.com | 2544b9.com | 914905.com | 26444i.com | 6830r.com | mgm3242c.com | 3009m.com | 3096.com | 2698j.com | d8502.com | 26444v.com | 6830b.com | 883399g.com | 59889t.com | 9895x.com | 65005w.com | x48s.com | www.56733k.com | wns88.com | www.50061b.com | www.8973.cc | www.pj5722.com | www.76060j.com | www.749558.com | www.4625y.com | www.9679s.com | www.hg0006.com | www.5816ee.com | www.81776.com | www.qq599.com | www.tyc002.com | www.608499.com | www.00773j.com | www.45598g.com | www.ba507.com | www.hg0297.com | www.166518.com | www.66653g.com | www.5578w.com | www.cf9904.com | www.657320.com | www.223268.com | 2127n.com | sxpj62908.com | 509.co | 5478d.com | 55967l.com | 2138.com | 272nn.net | www.bet3650077.com | www.v771177.com | www.443447.com | www.20199cc.com | www.9737ll.com | www.79095c.com | www.228128.com | www.55228h.com | www.chi59.com | www.586974.com | xin98556.com | 99111pp.com | 30173366.com | 44kk8332.com | 168cp-x.com | www.hg9934.com | www.566455.com | www.109016.com | www.262018.com | www.365380dh.com | www.fcyl7.com | www.303467.com | xf122.com | ww01365.com | 7k7k.com | 51200aa.com | www.365815m.com | www.82810.com | www.10999s.com | www.hg0297.com | www.2109t.com | www.364077.com | 3122h.com | xh75555.com | j7742.com | www.js003.cc | www.hg6069.com | www.hyi664.com | www.954321k.com | www.hc3849.com | www.43131p.com | 7380.com | 61652a.com | 4052b.com | www.555kkk.com | www.8473v.com | www.2418a.com | www.369888a.com | 25288r.com | 7508z.com | 642221.com | www.0377365.com | www.pj928.com | www.5446l.com | www.022sx.cc | 7196pp.com | 9hga.com | 2767k.com | www.v03888.com | www.4212s.com | www.ribo88.com | www.755096.com | 188qq999.com | v0142.com | www.hg582.com | www.422209.com | www.rrqp222.com | www.925507.com | 11v111.com | 5350com.com | www.0555hg.com | www.610567.com | www.rrqp333.com | www.825799.com | 6868vv.cc | g5429.com | www.4x0048.com | www.198930.com | www.21202i.com | www.202430.com | 8fll8.com | 689030.com | www.15425.com | www.772875.com | www.560721.com | 2008kk.com | k2554.com | www.kj88822.com | www.0022sun.com | www.805595.com | b778877.com | 2546d.com | www.tyc5955.com | www.ls22.vip | www.683944.com | rrr5682.com | 3078d.com | www.447334.com | www.9422d.com | www.186126.com | 00774ss.com | www.yh3377.cc | www.673888j.com | www.55clf.com | 7935z.com | 2997700.com | www.365.pw | www.7239r.com | 32126a.net | 46474647.com | www.vns2018.com | www.t63568.com | www.257015.com | 30178877.com | www.8694t.com | www.47506d.com | www.699925.com | wx99.com | www.v0050.com | www.mgm868007.com | www.950596.com | 33599bb.com | www.xjs8896.com | www.16181w.com | www.am7779.com | 88894a.com | www.hg9070.com | www.4996.com | www.755804.com | 649600.com | www.xpj3398.com | www.hg32228.com | www.383566.com | 34q35.com | www.15b19.net | www.831666.com | 83377p.com | 3202p.com | www.4963t.com | www.914979.com | w9629.com | www.4938e.com | www.333999qipai.com | 9649h.com | 38851100.com | www.5504l.com | www.934277.com | 063976.com | www.10050755.com | www.3a435.com | 35252i.com | www.1869b.com | www.47506l.com | www.129177.com | 8988v.com | www.489858.com | www.862455.com | 55323i.com | www.36389k.com | www.61233n.com | 06385353.com | www.cr1112.com | www.999999qipai.com | c83.net | c388w.com | www.565548.com | www.33598v.com | 8290t.com | www.10999k.com | www.277739.com | 8884win.com | www.163a44.com | www.509433.com | bowang005.com | www.940999.com | www.514611.com | t72227.com | www.28000n.com | www.296676.com | 38886508.com | www.ba008.com | www.66652i.com | 28487000.com | www.79095t.com | 7030055.com | 1288bb.com | www.0088hg.com | 33115zz.com | www.hg97hg.com | www.8d838.com | 6137q.com | www.xpj7747.net | www.000ac.com | 316960.com | www.fc596.com | www.542998.com | 6663847.com | www.115527u.com | 3222z.cc | www.333560.com | www.99788m.com | yhyunnan.vip | www.hg131d.com | www.703953.com | 38851100.com | www.627464.com | 921350.com | www.55268xx.com | www.50069.com | amhg007.com | www.cp66611.com | www.090392.com | 7334x.com | www.fg9909.com | 3807bb.com | www.986msc.com | www.423689.com | hg91558.com | www.t63568.com | 1775vv.com | www.438686.com | www.551409.com | 3136ee.com | www.68993226.com | 0080u.com | www.2945g.com | www.43131i.com |