• <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.8473z.com | www.377666l.com | www5682.com | www.js8600 | 1315559.com | www.828326.com | www.21365bb.com | 55145.com | www.316088.com | 3405dd.com | www.80767n.com | www.pj3234.com | www.196903.com | www.875599.com | 9994cc8.com | www.209337.com | 50027799.com | www.022194.com | www.998855s.com | 0123.com | www.73166b.com | www.514277.com | 5360rr.com | www.4136h.com | 80368u.com | www.fcyl1.com | www.400658.com | 500000436.com | www.jl58qp.com | 99932949.com | 5005h.com | www.zzw222.com | 75991q.com | www.035069.com | www.808888o.com | uu01234.com | www.949429.com | www.87865.com | 5651k.com | www.66376m.com | www.07078006.com | yth003.net | www.766885.com | www.033033u.com | 2222k4.com | www.4102p.com | 15f9.net | 3616h.com | www.ihg5511.com | www.1019992.com | 30006r.com | www.7240k.com | www.7435h.com | 3222t.cc | www.15355l.com | www.345188.com | hm0282.com | www.cmc.cc | www.162277.com | 7720y.net | www.401271.com | www.53094444.com | 9439911.com | 060939.com | www.68993258.com | www.v99950.com | 73730524.com | www.670209.com | www.9737aa.me | 3424v.com | js66661.com | www.36166x.com | www.173msc.com | 45888a.com | www.833314.com | www.9737cc.me | 33443885.com | 59522w.com | www.qin618.com | www.799666e.com | 2381i.com | 168c6.com | www.fg9907.com | www.hg1005.com | 55323o.com | www.550417.com | www.4058rr.com | 897ll.cc | baliren01.com | www.c1350.com | www.cn365y.com | www.yh05678.com | 3222y.cc | www.188727.com | www.3691n.com | www.56520u.com | 85698q.com | 3301844.com | www.4323y.com | www.66333666.com | 20778888.com | 2078v.com | www.9lbc.com | www.06387788.com | www.pj6339.com | 001122335.com | 66300vip07.com | www.588vip.top | www.hg7739.com | 883399q.com | bet99331.com | www.364688.com | www.j98478.com | www.69077.com | xpj888.com | 1407.cc | www.596702.com | www.707987.com | www.hg8201.com | 188qq22.com | 3556vip5.com | 55545s.com | www.0270g.com | www.87665w.com | bbb444000.com | pu65.com | www.981jc.com | www.ba008.com | www.677100.com | 2127ww.com | 7007570.com | www.594883.com | www.42842807.com | www.1168m.com | www.vns6166.com | m01234.com | 20040.com | www.554363.com | www.21365bet.com | www.9737ww.me | www.88837s.com | 11453322.com | 60235998.com | www.298730.com | www.8839m.com | www.3421b.com | www.965082.com | www.525xpj.com | 663334.com | y68com | e62365.com | www.269777a.com | www.42456666.com | www.356062.com | www.2078f.com | 9949g.com | 993311.com | 9876blr.com | www.859505.com | www.88266f.com | www.45598z.com | www.280999.com | www.zs1199.com | 45637z.com | 8569899.com | 4195d.com | www.641638.com | www.78949p.com | www.733486.com | www.37tyc.com | www.v771177.com | 4812222.com | c08199.com | 30175555.com | 1331h.com | 7605y.com | www.444070.com | www.99fc.cc | www.pujing95.com | www.668puj.com | www.727321.com | www.222884.com | www.3643j.com | 5002s.com | 6150g.com | 93910.com | 4255ee.com | qy6682.com | 88119w.com | www.283550.com | www.901031.com | www.5086p.com | www.ejylc16.com | www.62979b.com | www.5099ff.com | www.hf7799.com | www.pj8980.com | www.7025h.com | www.pjdc2288.com | www.hg9092.com | 3379aa.com | 2147788.com | 80118.com | 5019kze.com | 7920com.com | 1679bb.com | 1397.cc | 555vn77.com | www.78949e.com | www.480840.com | www.axc5.com | www.ya499.com | www.34489.cc | www.11201.cc | www.3416j.com | www.50080l.com | www.725641.com | www.7148.com | www.tyc88666.com | www.77114x.com | www.5647e.com | www.868553.com | www.6939i.com | www.9646x.com | www.1128229.com | www.y07a.com | www.ky1008.com | www.80065x.com | www.67258c.com | www.61655z.com | www.26878y.com | www.26878q.com | www.56579.cc | www.axc5.com | www.652623.com | www.672166.com | www.494969.com | www.330671.com | www.290165.com | www.101377.com | 68680029.com | 65056.com | 9464002.com | 866666b.com | 66555156.com | 3467k.com | zunyi801.com | f3144.com | www.hg77848.com | www.h7788j.com | www.133vns.com | www.37533.com | www.349000.com | www.20199rr.com | www.ts058.com | www.ba505.com | www.7249r.com | www.7239o.com | www.6832y.com | www.869576.com | www.178281.com | 7989v.com | 1407a.com | 98345c.com | yh645.cn | ziz3.com | www.110978.com | www.799666u.com | www.47506c.com | www.68993255.com | www.757zf.com | www.599424.com | 19880t.com | 2805l.com | kkk67890.com | blh2018.com | www.benz4343.com | www.447334.com | www.4996ts.com | www.16065m.com | www.ya658.com | www.96386a.com | 2004871.com | 9646w.com | 55797o.com | www.298345.com | www.zr6668.com | www.00772x.com | www.flb905.com | www.6832o.com | www.355225.com | 3559sss.com | 0860dh.com | 3505.com | www.969516.com | www.ac775.com | www.48330o.com | www.hm8222.com | 80368p.com | 4647i.com | 56787qq.com | www.00829t.com | www.751cp1.com | www.065815.com | www.al5888.com | 7196n.com | 51133kk.com | jnn006.com | www.e23012.com | www.y063801.com | www.26299t.com | www.188712.com | 703669.com | yd12300.cc | www.w8867.com | www.x55.com | www.456669.com | www.529411.com | 66458m.com | pj09922.com | www.188tyc.com | www.26123cc.com | www.99340.cc | zzylc4.com | 67890zzz.com | www.7830o.com | www.4078m.com | www.26163p.com | 365063.com | 3467k.cc | www.yh17.com | www.06617a.com | www.38394.cc | 28288nn.com | ii67890.com | www.3959j.com | www.91779n.com | www.hy6932.com | 7744mmm.com | df8y.com | www.105353.com | www.44074.com | www.375953.com | 4778833.com | www.8494r.com | www.88166q.com | www.26878z.com | 77662007.com | t2306.com | www.bet3666.com | www.77114n.com | 4997s.com | 28288vv.com | www.656888.com | www.151228.com | 65005l.com | 2078.com | www.js276.com | www.88266m.com | 3024u.com | 992222j.com | www.c1121.com | www.77114n.com | u5429.com | 4442546.com | www.hf9019.com | www.022hn.cc | pjguangdong.com | www.7338007.net | www.6687d.com | www.308126.com | 4955y.com | www.tm003.cc | www.50026z.com | 8159c.cc | www.7720w.com | www.88325v.com | www.296233.com | dw777.net | www.bbs35.com | www.9478f.com | 61320099.com | www.vns9958.com | www.ws966.com | 36088.com | 8901p.com | www.5099kk.com | www.602475.com | t1915t.com | www.9920992.com | www.1035j.com | ppjj00.com | www.0860g.com | www.9646y.com | 99111pp.com | www.757xpj.com | www.66074.com | 11335156.com | www.9599440.com | www.11475.com | 256777k.com | 28824g.com | www.0600q.cc | 3822m.com | www.pj6333.com | www.55074.com | 44488b.com | www.7720z.com | www.560900.com | b01311.com | www.v27229.com | www.71233g.com | 20188m.com | www.hg9940.com | www.5095h.com | 02.bet | www.pj928.com | www.653192.com | 55797o.com | www.4996sy.com | 82093.com | www.407776.com | www.256818.com | 3700688.com | www.hg9958.com | www.950596.com | 01885e.com | www.9941331.com | 2418t.com | www.yh5555.cc | www.07163o.com | 461653.com | www.hg7857.com | www.500190.com | 2555.com | www.9422b.com | ddd4255.com | www.hy985.com | www.608587.com | 3379d.com | www.hg77760.com | 66090022.com | www.45681b.com | www.235117.com | j1503.com | www.71399z.com | 5856o.com | www.00773i.com | 7935a.com | www.66930011.com | www.737198.com | feicai0479.com | www.35898a.com | pp8662.com | www.8967j.com | 0747oo.com | www.v771177.com | www.rcw567.com | 23800g.com | www.6653e.com | pj88ss.com | www.47506w.com | dzyy076.com | www.41427.com | 58588.com | www.v15542.com | www.665993.com | 1775d.com | www.25688n.com | 998cpdl.com | www.089728.com | 6175pp.com | www.93955.com | 866666.org | www.489858.com | so11.cc | www.295111.com | baidu886.com | www.330099x.com | www.490680.com | www.tyc8808.com | www.911209.com | 2008tt.com | www.55cmc.com | feicai0470.com | www.9478e.com | 7989u.com | www.32123z.com | 2247o.com | www.50054r.com | 3665yh.com | www.a991qp.com | 25288w.com | www.771494.com | 73055d.com | www.96386c.com | hd6766.com | www.50788l.com | 37570d.com | www.23636n.com | 7744yyy.com | www.0014u.com | 5010.com | www.703270.com | www.ag.dl39709.com | www.452816.com | www.25288n.com | www.36166v.com | www.long-8.com | 4637711.com | www.5049e.com | 4812k.com | www.huangma27.com | 78666t.com | www.vinisi08.com | 2244buyu.com | www.85090.com | bm1395.com | www.652861.com | www.11995454.com | 80850p.com | www.132c73.com | 8722.com | www.5599nsb.com | uu7742.com | www.50024z.com | jinsha69.com | www.505507.com | www.8797aavv.com | 29522dd.com | www.bwinyz44.com | 3467i.am | www.43818z.com | www.taobaobo5.com | www.347277.com | www.776777.com | 444000zz.com | www.5446n.com | 8449ii.com | www.ck1178.com | www.0860k.com | 55555309.com | www.pj3608.com | 8449dd.com | www.okw2.com | www.js0096.com | 9464002.com | www.07679u.com | 2222k09.com | www.769289.com | www.0488.net | p888hh.com | www.680508.com | 219275.com | www.310657.com | www.799666v.com | 2009666.com | www.71399t.com | www.36536509.com | df8s.com | www.6880aa.com | 0033e.cc | www.332930.com | www.c44vv.com | 36405544.com | www.hw52.com | www.775412.com | nn56988.com | www.46689.com | www.yh3333.cc | 73999y.com | www.2208553.com | h2649.com | www.160881.com | www.623667.com | 7605c.com | www.607663.com | www.tz1555.com | 4018s.com | www.976981.com | www.81306b.com | 38365d.com | www.bxcp3.com | www.770222.com | 77605y.com | www.hj7987.com | www.v36.com | 3510.com | www.703270.com | www.20199dd.com | 8381v.com | www.547099.com | www.4972o.com | 8722zzzz.com | www.207109.com | www.7225p.com | hg168l.com | 5004qq.com | www.984707.com | www.yyy7777.com | 5855xx.com | www.26299q.com | www.000243.com | 4167e.com | www.585751.com | www.9737oo.com | n47479.com | 5004qq.com | www.28891d.com | www.9679j.com | 005873.com | www.901375.com | www.98698r.com | 23800z.com | 35aa.vip | www.73166l.com | www.hg3875.com | z9p5j.cn | www.hcw018.com | www.990893.com | www.3657e.com | 2767dcom | www.820737.com | www.85xpj.com | www.8520j.com | 8547r.com | www.3552q.com | www.bet66622.com | 931750.com | 3522ss.cc | www.16588t.com | www.0752drf.com | y854.cc | 3049w.com | www.26299m.com | www.1389mm.com | 6245.bet | blh888.vip | www.qml1.com | www.10999d.com | www.185ks.com | tt6828.com | www.626507.com | www.44118j.com | www.3643t.com | 77606e.com | www.029781.com | www.1358002.com | www.814c.com | 500000434.com | 67877q.com | www.ck3578.com | www.0096aa.com | www.333133p.com | 957939.com | 3616.com | www.34788s.com | www.ggy.99233y.com | www.pj550000.com | s886.com | 8180v.com | www.71399q.com | www.tc8804.com | www.625966.com | 7240r.com | 8520c.com | www.33997y.com | www.58118d.com | www.yh765111.com | j5069.com | 64898f.com | www.ya022.com | www.47506j.com | www.hg0458.com | v35151.com | aa67890.com | www.293255.com | www.988046.com | www.hh892.com | www.4625v.com | 0015vv.com | 0005144.com | www.550420.com | www.702wb.com | www.551c93.com | www.333133d.com | duch019.com | 15a32.net | www.151376.com | www.26299m.com | www.06820f.com | www.22252055.com | 5001f.com | 1h-7.cc | g15666.com | www.556742.com | www.91junzi.com | www.9737ff.me | www.hg8801.com | yh888e.com | 86611f.com | e1458.com | www.287926.com | www.15237.cc | www.8899gvb.com | www.ra0008.com | www.4107q.com | 588bbb.cc | 97570c.com | 3559c.com | www.345597.com | www.5095s.com | www.h36524.com | www.hh58.com | www.vns95500.net | www.hgjc.com | 33382d.com | dzj0707.com | 1463i.com | www.106572.com | www.qml4.com | www.00889a.com | www.1754o.com | www.jjjj009.com | www.mgm3838.com | 5456t.com | 9101906.com | 3678nnn.com | 12772255.com | 11018n.com | www.603854.com | www.7793j.com | www.587819.com | www.8645001.com | www.5966qqq.com | www.vv2649.com | www.b3657.com | qycp10.com | 8977ee.com | 0286.com | 1770k.com | 26444h.com | 3556vip7.com | www.506921.com | www.qucp6.com | www.71233k.com | www.0343u.com | www.115527w.com | www.kj310.cc | www.vns968.com | www.bte33.com | www.67797g.com | 1331l.com | 931750.com | 2349003.com | 40033hhh.com | 7605t.com | 365102b.com | 51337.com | 13976.com | 56988e.vip | 4880y.com | www.88399c.com | www.sjs07.com | 0747r.com | 66882007.com | 55967q.com | j333.cc | 5003822.com | 9995bcc | yy76669.com | 7779r.cc | 77605h.com | biwei116.com | 6191js.com | 44077a.com | 8522mmmm.com | 27878oo.com | 1483h.com | 50000997.com | 500000599.com | ylg5888.com | 9964h.com | 7744ooo.com | feicai0471.com | 3122e.com | vip201678.com | betke.cc | igcp.com | 27878jj.com | 8557k.com | b11988.com | 51133hhh.com | bowang22.com | 1227019.com | 39199u.com | 4556y.com | 28839v.com | JS1388s.com | 3844.com | 57157g.com | www.407878.com | www.333222m.com | www.h7788g.com | www.114915.com | www.caipiao037.com | www.1f888.com | www.ylg7777.com | www.cp0016.com | www.pj05x.com | www.704909.com | www.xpj126.com | www.ejylc12.com | www.83993j.com | www.36166m.com | www.can87.com | www.820158.com | www.249880.com | 365.sb | 9030o.com | 11773885.com | 7599h.com | 33pp8332.com | biying970vip.com | www.1019997.com | www.9547l.com | www.5487.com | www.58118d.com | www.w84f.com | www.xmsy.com | www.2500o.com | www.622209.com | www.77114o.com | 99567l.com | 3189e.com | 66671i.com | 0068.cc | www.0222js.com | www.2078c.com | www.93342.com | www.bwin930.co | www.jsc044.com | www.15355k.com | www.660686.com | 55331381.com | 138.am | 71707i.com | 365388.bet | www.2090900.com | www.683210.com | www.5981d.com | www.lb5555.com | www.022b.cc | www.188932.com | 1168x.com | 9679i.com | 218jc.com | www.bet3650514.com | www.88803.com | www.89677z.com | www.sx1811.com | www.898364.com | 9121902.com | yh888.com | 06382424.com | www.54776.com | www.c53889.com | www.62979w.com | www.54400t.com | www.444079.com | 897tt.cc | 3846xxx.com | www.9130.com | www.22248.com | www.h32031.com | www.89911.cc | www.112819.com | 535pj.cc | vic82.com | www.5678655.com | www.18123.com | www.9989583.com | www.938454.com | 6641m.com | 8159f.cc | www.jsh955.com | www.488633.com | www.75600v.com | www.lycp886.com | 4195ff.com | 3510.com | www.223456o.com | www.287722.com | www.13434b.com | www.599476.com | sn6059.com | 9971003.com | www.84299.com | www.7225j.com | www.9205c.com | js8800vip.com | xpj99909.com | www.040xpj.com | www.77731g.com | www.hg27288.com | www.289917.com | 85698g.com | 3544w.com | www.a11133.com | www.10888.com | www.330605.com | 30007l.com | 7894i.com | www.5049e.com | www.80075d.com | dytj365.com | pj88ee.com | www.668567b.com | www.5981w.com | www.ya390.com | 33678dd.com | feicai0908.com | www.877568.com | www.9989569.com | www.341077.com | 2789801.com | www.a78ts.com | www.wnsr3526.com | www.44tdc.com | 8betbet365.com | hgyz11.com | www.3589333.com | www.ky1002.com | jing6222.com | nn00558.com | www.0wdgj.com | www.68993272.com | www.54400i.com | 4196v.com | www.ao299.com | www.234567.pw | www.106396.com | 5856ooo.com | www.10050751.com | www.707987.com | www.61655o.com | 40033k.com | www.ccc826.com | www.hd8673.com | jing6222.com | 6766bb.com | www.1234118.com | www.26878m.com | 118888a.com | 4066ll.com | www.bwinyz46.com | www.698300.com | 6895798.com | www.91990a.com | www.1358004.com | 74395555.com | 2643r.com | www.808888u.com | www.978315.com | 55811.com | www.546suncity.com | www.4428229.com | 5004zz.com | 33115jj.com | www.673888a.com | www.562509.com | nn8159.cc | www.174886.com | www.3005y.com | 50099vip.com | www.09569x.com | www.ampj3439.com | j3410.com | www.hg0377.com | www.jsc899.com | 79889t.com | 0747z.com | www.b35jj.com | www.389344.com | 55545k.com | www.138cpg.com | www.786126.com | 3435g.com | www.28557.com | www.927670.com | xpj66112.com | www.3029.com | www.938906.com | 6723888.com | www.10444.com | www.775709.com | 5002nnn.com | www.20199uu.com | www.603224.com | 55331xx.com | www.4212w.com | www.305644.com | s2649.com | www.g7764.com | 58830.com | 866666q.com | www.7249m.com | 4323y.com | www.333133r.com | www.61655m.com | 9030v.com | www.hg5689.com | www.tlcp4.com | 9506f.com | www.983888c.com | www.221075.com | 2864e.com | www.4102k.com | bbb2267.com | www.333133r.com | www.34788b.com | 3822w.com | www.5966zzz.com | www.349377.com | 2019xx.cc | www.m99365.com | 66671b.com | www.9380l.com | www.dao90.com | 53262zz.com | www.c30666.com | 6002u.com | www.dy1188.com | www.8839b.com | 316m.cc | www.bwinyz46.com | 656456.com | www.4938s.com | www.002ac.com | 3650568.com | www.a1432.com | 5350r.com | www.65471188.com | www.935026.com | 30007h.com | www.7681006.com | 1434a.com | www.hg7695.com | www.229075.com | www.pj550055.com | www.66332t.com | 86226s.com | www.89677p.com | ule608.com | www.423886.com | www.401285.com | www.86611t.com | www.52072p.com | 4255qqq.com | www.vip9587.com | 61327744.com | www.613177.com | 66300vip48.com | www.hg7088.sh | www.11gpc.com | 05877.com | www.58qp.cc | 7605t.com | www.89677r.com | 56987nn.com | www.4411111.com | hg88814.com | www.692tyc.com | www.741770.com | 3544e.com | www.26163b.com | haobocaiwang.net | www.16065o.com | 3559dd.com | www.2997778.com |