• <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 9030b.com | www.7225g.com | www.a3a222.cc | fa8888.com | www.809183.com | www.9895n.com | www.77449.com | 0500.com | www.178763.com | www.538445.com | www.808777.com | c47479.com | kkk5144.com | www.2875y.com | www.89599n.com | www.k32126.cc | 8381f.com | www.50052v.com | www.ky1009.com | www.hndf333.com | 2677xxx.com | 58802e.com | www.737884.com | www.057v.com | www.gdnmi.com | www.600939.com | 6707888.com | 3245i.com | www.3933y.cc | www.78680a.com | www.442244.com | 1594.com | 00773.com | 2418s.com | www.936370.com | www.38vs88.com | www.hq5177.com | www.kk2233.com | 3482a.com | 4195g.com | www.39500b.com | www.h80288.com | www.h896.com | www.80852.com | 61652a.com | 112y.net | www.314577.com | www.50054b.com | www.00778b.com | www.38789b.com | www.030xpj.com | 73055l.com | 1077ii.com | www.855765.com | www.221222.cc | www.4406488.com | www.yvnsr.com | 518cp33.com | 3304f.com | 77995004.com | www.178761.com | www.097wy.com | www.12345606.cc | www.35252x.com | www.330099z.com | 6261v.com | 37775145.com | 08159f.com | wzyxwz.com | www.9149f.com | www.91779z.com | www.174666.com | www.9068cc.com | 8686699.com | 4590pp.com | 4303.com | 22995156.com | www.71399a.com | www.cai003.vip | www.bet353657.com | www.33678ii.com | www.c44jj.com | www.502414.com | 9566474.com | 88851z.com | amblr97570.com | 1516.com | js89t.vip | www.lg7717.com | www.12455g.com | www.567733.com | www.l1432.com | www.58665h.com | www.307607.com | www.0882389.com | 28487000.com | 3009m.com | weibo.com | 071919.com | dd00558.com | 500000599.com | www.52072v.com | www.571833.com | www.hx1116.com | www.2221103.com | www.30350z.com | www.19019i.com | www.bb8888-1.com | www.373365.com | www.777888yh.com | www.77605b.com | www.25288z.com | www.333222c.com | www.k8084.com | 8577q.cc | hg37370.com | 033j.net | 5443k.com | 3434zzz.com | 8381l.com | 214.net | 35222s.com | 3559hhh.com | ii3336.com | 955.com | 2222k06.com | ks3334.com | 265609.com | js89i.vip | 76181678.com | 55331vv.com | hg3457.com | c91234567.com | 1bet2.com | 5592958.com | hga55500.com | 91019.com | 7616.com | q86226.com | 4393.com | 998m.cc | jindaye88.com | 00048p.com | ks2223.com | 922310.com | 2649dd.com | 81511j.com | 6868cc.cc | 455.com | www.85770i.com | www.www-866766.com | www.7025j.com | www.8188zr.com | www.09527.com | www.888dsy.com | www.js600000.com | www.bwinyz34.com | www.4546800.com | www.88xpj68.com | www.55238f.com | www.66652c.com | www.3668aa.com | www.c7238.com | www.502135.com | www.43131h.com | 5002fff.com | 131vv.net | 16690077.com | 0234uu.com | 23599w.com | 5443r.com | 131aa.net | www.wn2008.com | www.sb273.com | www.js40123.com | www.97cp456.com | www.4446bbb.com | www.5886qq.com | www.2221102.com | www.106ak.com | www.550431.com | www.52072a.com | 70118w.com | 2190g.com | 6137o.com | 2767e.com | www.hg298.com | www.84299.com | www.5559961.com | www.4521d.com | www.js87882.com | www.52072z.com | www.825126.com | x59.com | 1545.com | 2214q.com | 86068ff.com | www.js889x.com | www.35252m.com | www.327969.com | www.727563.com | www.729937.com | 5804i.com | 3405v.com | yf788.net | www.hg0056.com | www.hg7945.com | www.3157g.com | www.xpj3133.net | www.5091f.com | www.165090.com | 7742vv.com | 4289x.com | 8030t.com | www.vip36059.com | www.64566f.com | www.6889783.com | www.cb5388.com | 0600x.cc | hg00000.com | 228888m.com | www.ylzz6662.com | www.pjgw66.com | www.15355c.com | www.112779.com | 9420h.com | 80368ee.com | www.a1a777.net | www.77731z.com | www.0343q.com | www.860836.com | hg1698.com | 866666m.com | gg4675.com | www.hg8052.com | www.3399nsb.com | www.c6378.com | zzylc3.com | 5360p.com | 4052w.com | www.449msc.com | www.cc00668.com | www.27czj.com | 20177.com | hjcp7.com | www.00amjs.com | www.80834.com | www.540066.com | www.855310.com | 4323y.com | y08199.com | www.vns6005.com | www.yl258.com | www.36166b.com | h88983.com | 4288r.com | www.55yh765.com | www.28000x.com | www.00840w.com | 9895m.com | 777659111.com | www.h0040.com | www.y32031.com | www.876488.com | 3169j.com | mm2205.com | www.ccc609.com | www.66136000.com | 38668.com | 55797i.com | www.87865.com | www.12136s.com | www.560161.com | 30175544.com | www.362811.com | www.xj6003.com | www.571477.com | 2190b.com | www.yf88.cc | www.65066cc.com | www.yi876.com | 9149l.com | 8827fff.com | www.61345.cc | www.youcai77.com | x33x.vip | www.m.hg763.com | www.6880jj.com | www.599642.com | ss1915.com | www.wnsr848.com | www.8700666.com | www.799657.com | 7779p.cc | www.88021ii.com | www.1466r.com | 075yy.com | jsjlb66.com | www.799666v.com | www.662by.com | 5003oo.com | www.xhtd0099.com | www.xpj5.net | 30006k.com | 3222v.cc | www.26123cc.com | www.941718.com | 4025o.com | www.hga8080.com | www.624201.com | 3389.com | www.yh1133.com | www.3421d.com | 998dlw.com | la688.com | www.88562.com | www.799200.com | am556.cc | www.56655p.com | www.461.cc | 579336.com | www.015456.com | www.84499y.com | 657.one | www.6662558.com | www.bmw8066.com | ab55.com | www.tushan48.com | www.db486.com | 116005.com | www.4759cc.com | www.3066ll.com | www.094499.com | feicai0517.com | www.yh234h.com | 077077.com | 689030.com | www.js58678.com | mgm.tt | www.pj2666.com | www.8577d.cc | 11bwi.com | www.yl00222.com | www.15365c.com | 5501.net | www.js743.com | www.959552.com | 365spa.com | www.00618f.com | www.620557.com | js3032.com | www.k063801.com | 8036xx.com | www.814suncity.com | www.55717r.com | 7792p.com | www.g1207.com | www.cp208.com | tt38648.cc | www.5446ll.com | 1219.com | www.9976755.com | www.36787j.com | bet36500.com | www.m4042.com | www.153880.com | 83086p.com | www.cr678.net | 30007g.com | www.452222.com | www.493306.com | yk105.com | www.4444msc.com | 32355cc.com | www.jsp02.com | www.805836.com | 2418p.com | www.69989a.com | 0015rr.com | www.533998.com | www.665039.com | 8686699.com | www.hg0088.so | 7893800.com | www.80969x.com | 0015tt.com | www.z27229.com | www.qilc5.com | 878365mm.com | www.u63568.com | lc99c.com | www.5049z.com | 55331w.com | www.xpj9199.com | www.igcp2.com | feicai0899.com | www.8905b.com | 1429e.com | www.cjcp345.com | 0201.cm | www.666.2222149.com | www.hjin9.com | 3009j.com | www.91709.com | 44444ylg.com | www.xpj6886.com | 22225309.com | www.9170115.com | JS1388p.com | www.491888.com | 11505.com | www.xpj810.com | www.407872.com | www.28758g.com | www.855312.com | www.dz825.com | www.jcai0.com | 890346.com | www.10888.com | 998d.cc | www.9350.vip | hbs481.com | www.vn888345.cc | 305225.com | www.3318.cc | 4466303.com | www.12136v.com | f21148.com | www.9187y.com | 4167w.com | www.7920q.com | mmm01234.com | www.377666t.com | ys-57.co | www.377666z.com | 2172226.com | www.12136x.com | 87363a.com | www.4546900.com | 7893w19.com | www.4102i.com | 38365i.com | www.9996.com | bb888822.com | www.js89s.vip | www.542116.com | www.www7893.cc | 1389y.com | www.493hd.com | 4195599.com | www.775678.com | 3136ww.com | www.267185.com | 7742rr.com | www.78680q.com | am661.cc | www.73736d.com | qq2649.com | www.978217.com | www.22799.com | www.158267.com | www.135suncity.com | j15666.com | www.t32939.com | 6118p.com | www.2234.cc | 702215.com | www.lfu8.com | www.9996ss.com | feicai0951.com | www.455361.com | k7454.com | www.37377d.com | 6245f.com | www.811257.com | www.hg5123.pw | 0241h.com | www.tyc748.com | 188qq444.com | www.531089.com | 3156qqq.com | www.573995.com | www.zr918.com | 1114661.com | www.6687n.com | 22kk8332.com | www.717229.com | www.hg1810.com | 52688p.com | www.81608k.com | 4116q.com | www.181599.com | www.5966uuu.com | zb153.com | www.8582ww.com | 4466.so | www.youxin9.cc | www.285280.com | 86811m.com | www.8d222.com | www.hg8988.com | www.79800a.com | www.808888m.com | 3559d.com | www.ascp3.com | www.js40123.com | 2613h.com | www.9522888.com | www.a2a888.cc | 5360jj.com | www.b35zz.com | 6907888.com | www.745557.com | www.87p333.com | aaa67890.com | www.074wy.com | www.2646x.com | ee00558.com | www.50732t.com | www.87680e.com | 89777i.com | www.502206.com | www.6491m.com | 55984y.com | www.168a56.com | www.8134.cc | x5816.com | www.33074.com | www.5554dhy.com | wnsr858.com | www.e98478.com | www.38200a.com | zhcp88.com | www.4331e.com | www.32126j.net | 1389o.com | www.224975.com | www.7009844.com | 0044886.com | www.55717s.com | www.593858.com | 66445003.com | www.ky1006.com | www.ljw033.com | 99567e.com | www.3479m.com | www.pj9001.com | mg0500.cc | www.669771.com | www.71071r.com | sss8827.com | zhcw.com | www.42456699.com | www.sun3305.com | djbet.com | www.3416t.com | www.444230.com | 4488aa.com | www.606255.com | www.4996gl.com | 2851n.com | 55970.net | www.0270v.com | www.917xpj4.com | 65560066.com | www.558402.com | www.4996yx.com | 56987dd.com | 15g9.net | www.7793o.com | www.99291a.com | cc00558.com | 111b9.com | www.js0909.com | www.2078i.com | 69619.com | www.598074.com | www.6687s.com | www.md005.com | 4646699.com | www.81233q.com | www.4583.com | 44447893.com | 51200tt.com | www.o98478.com | www.hg0125.com | 40033yy.com | g2490.com | www.99552yy.com | www.xpj3358.com | 444000xx.com | www.629913.com | www.97994d.com | www.amjs661.com | 4488ii.com | www.043552.com | www.4809o.com | www.slr000.com | 3568yy.com | 423342.com | www.7714b.com | www.5966rrr.com | 621155.com | jss1150.cn | www.5441k.com | www.hjcp77.com | P35tt.com | 3559xxx.com | www.843933.com | www.h3410.com | www.3046w.com | 02888722.com | 7155268.com | www.792088.com | www.xpj77123.com | www.89928.com | 11002229.com | lixingyoulun.com | www.9478r.com | www.gg55826.com | www.jinshagg.com | 3405vv.com | 5533412.com | www.87668y.com | www.dzcp8888.com | www.4763222.com | oo67890.com | 500000858.com | www.3478x.cc | www.y8853.com | www.585234.com | 2019g.cc | lehu998.com | www.52072m.com | www.55228j.com | www.848434.com | www.79884.com | 40420022.com | 00778r.com | www.483552.com | www.kywns.205115.com | www.cp67773.com | www.0099buyu.com | 2685.com | 9030o.com | www.609715.com | www.hg77740.com | www.5049k.com | www.6666.cm | fh7.927go.com | www.w84c.com | 4270qq.com | www.170882.com | www.1368w.cc | www.hg8884.com | www.8850w8.com | www.4488tq.com | www.88jt09.com | 00vv8331.com | qile260.com | ppjj02.com | www.hy5155.com | www.856668.com | www.518008.com | 0747r.com | 1466x.com | h61653.com | www.9818n.cc | www.820025.com | www.331suncity.net | nn2205.com | hg999333r.com | 56987qq.com | www.1888ac.com | www.69567.com | www.392066.com | www.wns365.com | 5003z.com | b899.xyz | www.wcp8898.com | www.35918q.com | www.p1432.com | www.411036.com | www.xin2.net | 8344999.com | 1427.com | www.215880.com | www.9205d.com | www.0600e.cc | www.fff3997.com | www.21365qq.com | 3122tt.com | link01.png | t8159.cc | www.286967.com | www.6364b.com | www.1764z.com | www.45682.com | www.a80065.com | jjfysc.com | 00774ww.com | 44005002.com | zguvgd.com | www.599849.com | www.29277j.com | www.blr9944.com | www.8967x.com | www.679suncity.com | www.nstar88.com | mgm3242w.com | 86611z.com | 15856a.com | 063805.com | www.533082.com | www.2934q.com | www.9422h.com | www.6880kk.com | www.jx5544.com | www.xx9090.com | www.vn676.com | sha0003.com | 57157u.com | 5003oo.com | 365225.com | 132ag88.com | www.596531.com | www.055g.cc | www.b387387.com | www.12345601.cc | www.huayi388.com | www.799666c.com | www.11557712.com | www.127788.net | 1669jt.com | 3178h.com | fh7.com | 80878s.com | w1429.com | 4066x.com | 22296qq.com | www.33588e.com | www.501354.com | www.918109.com | www.1368o.cc | www.50080s.com | www.6022888.com | www.4809w.com | www.y8859.com | www.7893.ag | www.sb5508.com | www.79500q.com | www.blg888.com | www.74109f.com | www.532156.com | www.hg130.com | www.2846s.com | www.bet365608.com | www.hg45888.com | www.033033r.com | 5651m.com | 3844n.com | 2019pp.cc | 55ee8332.com | 7945kk.com | 99111aa.com | rr2649.com | 0332x.com | 2021o.com | fc9596.com | 588iii.cc | gsq520.com | 2776d.com | 8290z.com | 4023o.com | 64111o.com | 30006.com | 67888.am | 1775mm.com | www.588msc.com | www.ylg0099.com | www.821558.com | www.63877b.com | www.119946.com | www.3459k.com | www.29886v.com | www.53516a.com | www.1596e.com | www.44400.cc | www.34311.com | www.821623.com | www.8313b.com | www.4996cz.com | www.33678ww.com | www.3678.com | www.68203g.com | www.80075l.com | www.58181.cc | www.jcai5.com | www.701671.com | www.373909.com | 56787.com | 2998i.com | 7394444.com | 1098.cc | 73055w.com | 3822k.com | 55bb8332.com | 1775ee.com | www.10899d.com | www.22js66.com | www.38001.com | www.27363i.com | www.00778j.com | www.97828f.vip | www.80767t.com | www.rrle1.com | www.511073.com | hlw1177.com | 30019pp.com | ly88888884.com | gg4119.com | 2021vvv.com | www.dfs995.com | www.333133l.com | www.hg8447.com | www.8516.com | www.44118v.com | www.525409.com | www.696by.com | www.k6366.com | www.147373.com | www.x888789.com | www.82gcw.com | jx2500.com | 3089s.com | 6220q.com | www.41685.com | www.4996jl.com | www.43818q.com | www.097638.com | 582466.com | 87665q.com | www.8966kk.com | www.704908.com | www.5091n.com | 1483bb.com | 0905.com | 63305c.com | www.3983079.com | www.8967t.com | www.55676d.com | www.3552a.com | www.196309.com | 365644.com | 0099220.com | 4116r.com | www.yh9993.cc | www.88166x.com | www.6889791.com | www.c136.vip | dahongying.com | 454663.com | 131ccc.net | www.58777k.com | www.mhcpgw.com | www.832255.com | www.978217.com | 0747cc.com | bet577s.com | d8501.com | www.131msc.com | www.469702.com | www.35918k.com | www.165090.com | 1483ii.com | 2019b.cc | www.d8867.com | www.35700e.com | www.25288r.com | www.16297766.com | www.a69096.com | www.820737.com | 2019rr.cc | wfcp444333.com | www.18484.com | www.6939x.com | www.099210.com | qqq40033.com | www.4938r.com | www.w84f.com | www.581209.com | 876q.com | www.yh8215.com | www.35252c.com | www.817336.com | 3467l.com | www.a3a111.cc | www.848777k.com | www.cp8006.cc | 3033s.com | 8036h.com | www.678688.com | www.81608a.com | www.447478.com | c388r.com | 88304p.com | www.91w.com | www.bet73v.com | www.50064o.com | 40033bbb.com | www.yh567.com | www.1122xpj.net | www.2350x.com | 2934g.com | 61321133.com | www.66667666.com | www.96756.com | www.xinyc1.com | 9679l.com | www.39695m.com | www.60048.com | www.979505.com | huangma21.com | 50025577.com | www.3g88.com | www.3479q.com | 1775i.com | 3202x.com | www.gd68199.com | www.8667e.com | 500000565.com | 023280.com | www.370190.com | www.7793t.com | 53262u.com | 6830q.com | www.rycp051.com | www.077wy.com | 1985555.com | 12742x.com | www.848777p.com | www.893023.com | mi533.com | www.boma0157.com | www.xyh6002.com | www.305995.com | 82365n.com | www.zb966.com | www.25809.com | 022679.com | jsjlb11.com | www.56655g.com | www.35czj.com | man993.com | www.hg2087.com | www.jsdc9333.com | www.105636.com | 01885a.com | www.bj448.com | www.50026q.com | 66066o.com | www.1112xj.com | www.33678gg.com | www.302830.com | b21148.com | www.xam88888.wang | www.11081.cc | 20771199.com | www.32126e.net | www.780780a.com | 65005l.com | wancai.com | www.wnsr3536.com | www.511073.com | 4488v.com | www.18765.com | www.965176.com | 444000ff.com | www.h7733.com | www.80767.com | 5856fff.com | www.tyc797.com | www.84499z.com | 4052n.com | www.d30226.com | www.yh76g.com | 8449oo.com | www.88807d.com | www.sx1811.com | uu1916.com | www.t8119.com | www.7239s.com | 80892pp.com | www.pj5904.com | www.25688l.com | 08820033com | www.hg8517.com | www.022w.cc | 5856ee.com | www.pm48.com | www.715121.com | 0015vv.com | www.9737oo.me | www.163770.com | 284813.com | www.js89w.vip | 11z66.com | www.ylg05.com | www.07163a.com | hw002.com | www.304999.com | www.938518.com | 2334vip4.com | www.55060r.com | 3936w.com | www.814suncity.com | www.5952122.com | 091166.com | www.tyc658.com | www.927986.com | raybet39.com | www.4058tt.com | 8827rr.com | www.4107h.com | www.80175.com | nn4255.com | www.808888x.com | www.34788e.com | www.854556.com | www.ky1003.com | 88ff940.com | www.55526v.com | www.196056.com | 20772244.com | www.js18600.com | 97789.com | www.mhcp5.com | 7720776.com | www.8494w.com | www.07163t.com | 3957m.com | www.xpj718.com | 3788kk.com | www.zzmzjx.com | www.771246.com | 33115ee.com | www.806765.com | tzvip2028.com | www.68277111.com | www.52072i.com | www.ven2222.com | www.3552b.com | tjhyncw.com | www.780780f.com | 3890o.com | www.c559cc.com | e62365.com | www.00618s.com | www.959551.com | 2643b.com | www.bet73r.com | 4018h.com | www.9895m.com | 1463q.com | www.h9478.com | 9339999j.com | www.6767msc.com | www.732400.com | 5446q.com | www.36166k.com | 2127t.com | www.7240l.com | 8547z.com | www.bwinyz33.com | 749102.com | www.542suncity.com | 668cp00.com | www.2646x.com | www.73166a.com | www.330099w.com |