Java設(shè)計模式之 [2] 創(chuàng)建型模式 - 工廠模式

簡單工廠模式

簡介

  1. 簡單工廠模式屬于創(chuàng)建型模式,是工廠模式中的一種.簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一個產(chǎn)品類的實例 簡單工廠模式是工廠模式家族中最簡單實用的模式
  2. 簡單工廠模式:定義了一個創(chuàng)建對象的類,由這個類口來封裝實例化對象的行為(代碼)
  3. 在軟件開發(fā)中,當(dāng)我們會大量的創(chuàng)建某種,某類或者某批對象的時候,就會使用到工廠模式
為何使用簡單工廠模式 舉個例子 制作披薩的例子
//將Pizza 類做成抽象
public abstract class Pizza {
    protected String name; //名字

    //準備原材料, 不同的披薩不一樣,因此稠鼻,我們做成抽象方法
    public abstract void prepare();

    
    public void bake() {
        System.out.println(name + " baking;");
    }

    public void cut() {
        System.out.println(name + " cutting;");
    }

    //打包
    public void box() {
        System.out.println(name + " boxing;");
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class CheesePizza extends Pizza {

    @Override
    public void prepare() {
        System.out.println(" 給制作奶酪披薩 準備原材料 ");
    }

}
public class GreekPizza extends Pizza {

    @Override
    public void prepare() {
        System.out.println(" 給希臘披薩 準備原材料 ");
    }

}
public class OrderPizza {

     //構(gòu)造器
    public OrderPizza() {
        Pizza pizza = null;
        String orderType; // 訂購披薩的類型
        do {
            orderType = getType();
            if (orderType.equals("greek")) {
                pizza = new GreekPizza();
                pizza.setName(" 希臘披薩 ");
            } else if (orderType.equals("cheese")) {
                pizza = new CheesePizza();
                pizza.setName(" 奶酪披薩 ");
            }  else {
                break;
            }
            //輸出pizza 制作過程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
            
        } while (true);
    }

    // 寫一個方法腰埂,可以獲取客戶希望訂購的披薩種類
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 種類:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

}

//相當(dāng)于一個客戶端矫夷,發(fā)出訂購
public class PizzaStore {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //new OrderPizza();
    }
}

測試:

input pizza 種類:
greek
 給希臘披薩 準備原材料 
 希臘披薩  baking;
 希臘披薩  cutting;
 希臘披薩  boxing;
input pizza 種類:

假如此時再增加一個 披薩 的種類 需要繼續(xù)修改很多代碼

public class PepperPizza extends Pizza {

    @Override
    public void prepare() {
        System.out.println(" 給胡椒披薩準備原材料 ");
    }

}
public class OrderPizza {

     //構(gòu)造器
    public OrderPizza() {
        Pizza pizza = null;
        String orderType; // 訂購披薩的類型
        do {
            orderType = getType();
            if (orderType.equals("greek")) {
                pizza = new GreekPizza();
                pizza.setName(" 希臘披薩 ");
            } else if (orderType.equals("cheese")) {
                pizza = new CheesePizza();
                pizza.setName(" 奶酪披薩 ");
            } else if (orderType.equals("pepper")) {
                pizza = new PepperPizza();
                pizza.setName("胡椒披薩");
            } else {
                break;
            }
            //輸出pizza 制作過程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
            
        } while (true);
    }

    // 寫一個方法漱受,可以獲取客戶希望訂購的披薩種類
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 種類:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

}

怎么修改 使用簡單工廠類

代碼

//簡單工廠類
public class SimpleFactory {

    //更加orderType 返回對應(yīng)的Pizza 對象
    public Pizza createPizza(String orderType) {

        Pizza pizza = null;

        System.out.println("使用簡單工廠模式");
        if (orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName(" 希臘披薩 ");
        } else if (orderType.equals("cheese")) {
            pizza = new CheesePizza();
            pizza.setName(" 奶酪披薩 ");
        } else if (orderType.equals("pepper")) {
            pizza = new PepperPizza();
            pizza.setName("胡椒披薩");
        }
        
        return pizza;
    }

修改代碼

public class OrderPizza {

    //定義一個簡單工廠對象
    SimpleFactory simpleFactory;
    Pizza pizza = null;
    
    //構(gòu)造器
    public OrderPizza(SimpleFactory simpleFactory) {
        setFactory(simpleFactory);
    }
    
    public void setFactory(SimpleFactory simpleFactory) {
        String orderType = ""; //用戶輸入的
        
        this.simpleFactory = simpleFactory; //設(shè)置簡單工廠對象
        
        do {
            orderType = getType(); 
            pizza = this.simpleFactory.createPizza(orderType);
            
            //輸出pizza
            if(pizza != null) { //訂購成功
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println(" 訂購披薩失敗 ");
                break;
            }
        }while(true);
    }
    
    // 寫一個方法返顺,可以獲取客戶希望訂購的披薩種類
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 種類:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

測試類

//相當(dāng)于一個客戶端肥隆,發(fā)出訂購
public class PizzaStore {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
//      new OrderPizza();
        
        //使用簡單工廠模式
        new OrderPizza(new SimpleFactory());
        System.out.println("~~退出程序~~");
    }
}

測試結(jié)果

input pizza 種類:
greek
使用簡單工廠模式
 給希臘披薩 準備原材料 
 希臘披薩  baking;
 希臘披薩  cutting;
 希臘披薩  boxing;
input pizza 種類:

使用簡單工廠模式
 訂購披薩失敗 
~~退出程序~~

這樣修改之后,以后需要修改,就只需要修改 工廠類和需要添加的類 而生產(chǎn)披薩就不用再修改代碼

簡單工廠也叫做靜態(tài)工廠模式

代碼

//簡單工廠類
public class SimpleFactory {

    //更加orderType 返回對應(yīng)的Pizza 對象
    public Pizza createPizza(String orderType) {

        Pizza pizza = null;

        System.out.println("使用簡單工廠模式");
        if (orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName(" 希臘披薩 ");
        } else if (orderType.equals("cheese")) {
            pizza = new CheesePizza();
            pizza.setName(" 奶酪披薩 ");
        } else if (orderType.equals("pepper")) {
            pizza = new PepperPizza();
            pizza.setName("胡椒披薩");
        }
        
        return pizza;
    }
    
    //簡單工廠模式 也叫 靜態(tài)工廠模式 
    
    public static Pizza createPizza2(String orderType) {

        Pizza pizza = null;

        System.out.println("使用簡單工廠模式2");
        if (orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName(" 希臘披薩 ");
        } else if (orderType.equals("cheese")) {
            pizza = new CheesePizza();
            pizza.setName(" 奶酪披薩 ");
        } else if (orderType.equals("pepper")) {
            pizza = new PepperPizza();
            pizza.setName("胡椒披薩");
        }
        
        return pizza;
    }
}

這樣再調(diào)用的時候就可以通過類名調(diào)用了

public class OrderPizza2 {

    Pizza pizza = null;
    String orderType = "";

    // 構(gòu)造器
    public OrderPizza2() {

        do {
            orderType = getType();
            pizza = SimpleFactory.createPizza2(orderType);

            // 輸出pizza
            if (pizza != null) { // 訂購成功
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println(" 訂購披薩失敗 ");
                break;
            }
        } while (true);
    }

    // 寫一個方法,可以獲取客戶希望訂購的披薩種類
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 種類:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}
//相當(dāng)于一個客戶端,發(fā)出訂購
public class PizzaStore {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
//      new OrderPizza();
        
        //使用簡單工廠模式
//      new OrderPizza(new SimpleFactory());
//      System.out.println("~~退出程序~~");
        
        new OrderPizza2();
    }
}

輸出測試

input pizza 種類:
greek
使用簡單工廠模式2
 給希臘披薩 準備原材料 
 希臘披薩  baking;
 希臘披薩  cutting;
 希臘披薩  boxing;
input pizza 種類:
qw
使用簡單工廠模式2
 訂購披薩失敗 

工廠方法模式

簡介

工廠方法模式設(shè)計方案:將披薩項目的實例化功能抽象成抽象方法,在不同的口味點餐子類中具體實現(xiàn)
工廠方法模式:定義了一個創(chuàng)建對象的抽象方法.由子類決定實例化的類.工廠模式方法把對象的實例化推遲到子類

需求:客戶在點披薩的時候,可以點不同口味的披薩,比如 北京的奶酪披薩.北京的胡椒披薩,或者是倫敦的胡椒披薩

思路1

使用簡單工廠模式,創(chuàng)建不同的工廠類,比如 BJSimpleFactory 或者 LDSimpleFactory等.但是不易于維護,可拓展性不好

思路2

使用工廠方法模式


UML類圖分析

創(chuàng)建以上的方法

/將Pizza 類做成抽象
public abstract class Pizza {
    protected String name; //名字

    //準備原材料, 不同的披薩不一樣搀绣,因此飞袋,我們做成抽象方法
    public abstract void prepare();

    
    public void bake() {
        System.out.println(name + " baking;");
    }

    public void cut() {
        System.out.println(name + " cutting;");
    }

    //打包
    public void box() {
        System.out.println(name + " boxing;");
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class BJCheesePizza extends Pizza{

    @Override
    public void prepare() {
        setName("北京奶酪披薩");
        System.out.println("北京奶酪披薩 準備原材料");
    }

}
public class BJPepperPizza extends Pizza {

    @Override
    public void prepare() {
        setName("北京胡椒披薩");
        System.out.println("北京胡椒披薩 準備原材料");
    }

}
public class LDCheesePizza extends Pizza{

    @Override
    public void prepare() {
        setName("倫敦奶酪披薩");
        System.out.println("倫敦奶酪披薩 準備原材料");
    }

}
public class LDPepperPizza extends Pizza {

    @Override
    public void prepare() {
        setName("倫敦胡椒披薩");
        System.out.println("倫敦胡椒披薩 準備原材料");
    }

}
public abstract class  OrderPizza {
    //定義一個抽象方法  createPizza 讓各個工廠子類自己實現(xiàn)
    abstract Pizza createPizza(String orderType);
    
     //構(gòu)造器
    public OrderPizza() {
        Pizza pizza = null;
        String orderType; // 訂購披薩的類型
        do {
            orderType = getType();
            pizza = createPizza(orderType);  //抽象
            //輸出pizza 制作過程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
            
        } while (true);
    }

    // 寫一個方法,可以獲取客戶希望訂購的披薩種類
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 種類:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

}
public class LDOrderPizza extends OrderPizza {

    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new LDCheesePizza();
        }else if(orderType.equals("pepper")) {
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}
public class BJOrderPizza extends OrderPizza{

    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new BJCheesePizza();
        }else if(orderType.equals("pepper")) {
            pizza = new BJPepperPizza();
        }
        return pizza;
    }

}

測試

public class PizzaStore {
    public static void main(String[] args) {
        //創(chuàng)建北京口味的披薩
        new BJOrderPizza();
//      new LDOrderPizza();
    }
}

測試結(jié)果

input pizza 種類:
cheese
北京奶酪披薩 準備原材料
北京奶酪披薩 baking;
北京奶酪披薩 cutting;
北京奶酪披薩 boxing;
input pizza 種類:
pepper
北京胡椒披薩 準備原材料
北京胡椒披薩 baking;
北京胡椒披薩 cutting;
北京胡椒披薩 boxing;
input pizza 種類:
input pizza 種類:
cheese
倫敦奶酪披薩 準備原材料
倫敦奶酪披薩 baking;
倫敦奶酪披薩 cutting;
倫敦奶酪披薩 boxing;
input pizza 種類:
pepper
倫敦胡椒披薩 準備原材料
倫敦胡椒披薩 baking;
倫敦胡椒披薩 cutting;
倫敦胡椒披薩 boxing;
input pizza 種類:

抽象工廠模式

簡介

1.抽象工廠模式:定義了一個 interface 用于創(chuàng)建相關(guān)或有依賴關(guān)系的對象簇 而無需指明具體的類
2.抽象工廠模式可以將簡單工廠模式工廠方法模式進行整合
3.從設(shè)計層上看,抽象工廠模式就是對簡單工廠模式的改進(或者是進一步的抽象)
4.將工廠模式抽象成兩層:AbsFactory(抽象工廠)和具體的實現(xiàn)工廠子類,程序員可以根據(jù)創(chuàng)建的對象類型使用對應(yīng)的工廠子類.這樣將單個的簡單工廠類變成了 工廠簇,更利于代碼的維護和拓展


繼續(xù)修改上一個披薩案例
UML圖
其中

BJCheesePizza.java
BJPepperPizza.java
LDCheesePizza.java
LDPepperPizza.java
Pizza.java

沒有修改
//是一個抽象工廠模式的接口
public interface AbsFactory {
    //讓下面的工廠子類 來具體實現(xiàn)
    public Pizza createFactory(String orderType);
}
public class BJFactory  implements AbsFactory{

    @Override
    public Pizza createFactory(String orderType) {
        System.out.println("使用的是抽象方法創(chuàng)建");
        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new BJCheesePizza();
        }else if(orderType.equals("pepper")) {
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
public class LDFactory  implements AbsFactory{

    @Override
    public Pizza createFactory(String orderType) {
        System.out.println("使用的是抽象方法創(chuàng)建");
        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new LDCheesePizza();
        }else if(orderType.equals("pepper")) {
            pizza = new LDPepperPizza
                    ();
        }
        return pizza;
    }
}
public class OrderPizza {
    AbsFactory absFactory;

    public OrderPizza(AbsFactory factory) {
        setFactory(factory);
    }

    private void setFactory(AbsFactory factory) {
        Pizza pizza = null;
        String orderType = "";// 用戶輸入
        this.absFactory = factory;
        do {
            orderType = getType();
            // factory可能是北京的工廠子類,也可能是倫敦的工廠子類
            pizza = factory.createFactory(orderType);
            if (pizza != null) {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println("訂購失敗");
                break;
            }
        } while (true);
    }

    // 寫一個方法链患,可以獲取客戶希望訂購的披薩種類
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 種類:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

測試

public class PizzaStore {
    public static void main(String[] args) {
        new OrderPizza(new BJFactory());
//      new OrderPizza(new BJFactory());
    }
}

打印結(jié)果

input pizza 種類:
pepper
使用的是抽象方法創(chuàng)建
北京胡椒披薩 準備原材料
北京胡椒披薩 baking;
北京胡椒披薩 cutting;
北京胡椒披薩 boxing;
input pizza 種類:
cheese
使用的是抽象方法創(chuàng)建
北京奶酪披薩 準備原材料
北京奶酪披薩 baking;
北京奶酪披薩 cutting;
北京奶酪披薩 boxing;
input pizza 種類:
input pizza 種類:
pepper
使用的是抽象方法創(chuàng)建
北京胡椒披薩 準備原材料
北京胡椒披薩 baking;
北京胡椒披薩 cutting;
北京胡椒披薩 boxing;
input pizza 種類:
cheese
使用的是抽象方法創(chuàng)建
北京奶酪披薩 準備原材料
北京奶酪披薩 baking;
北京奶酪披薩 cutting;
北京奶酪披薩 boxing;
input pizza 種類:
工廠模式在 JDK-Calendar應(yīng)用的源碼分析

JDK的Calendar類,就是使用了簡單工廠模式

public class Factory {
    public static void main(String[] args) {
        Calendar cal =  Calendar.getInstance();
        System.out.println(cal.get(Calendar.YEAR));
        System.out.println(cal.get(Calendar.MONTH)+1);
        System.out.println(cal.get(Calendar.DAY_OF_MONTH));
        System.out.println(cal.get(Calendar.DAY_OF_YEAR));
        System.out.println(cal.get(Calendar.MINUTE));
        System.out.println(cal.get(Calendar.SECOND));
    }
}
 public static Calendar getInstance(){
        return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}
private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
        CalendarProvider provider =
            LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
                                 .getCalendarProvider();
        if (provider != null) {
            try {
                return provider.getInstance(zone, aLocale);
            } catch (IllegalArgumentException iae) {
                // fall back to the default instantiation
            }
        }

        Calendar cal = null;

        if (aLocale.hasExtensions()) {
            String caltype = aLocale.getUnicodeLocaleType("ca");
            if (caltype != null) {
                switch (caltype) {
                case "buddhist":
                cal = new BuddhistCalendar(zone, aLocale);
                    break;
                case "japanese":
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                    break;
                case "gregory":
                    cal = new GregorianCalendar(zone, aLocale);
                    break;
                }
            }
        }
        if (cal == null) {
            // If no known calendar type is explicitly specified,
            // perform the traditional way to create a Calendar:
            // create a BuddhistCalendar for th_TH locale,
            // a JapaneseImperialCalendar for ja_JP_JP locale, or
            // a GregorianCalendar for any other locales.
            // NOTE: The language, country and variant strings are interned.
            if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
                cal = new BuddhistCalendar(zone, aLocale);
            } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                       && aLocale.getCountry() == "JP") {
                cal = new JapaneseImperialCalendar(zone, aLocale);
            } else {
                cal = new GregorianCalendar(zone, aLocale);
            }
        }
        return cal;
    }
工廠模式的小結(jié)

1.工廠模式的意義
將實例化對象的代碼提取出來,放到一個類中統(tǒng)一管理和維護,達到和主項目的依賴關(guān)系的解耦,從而提升項目的拓展和維護性
2.三種工廠模式
3.設(shè)計模式的依賴抽象原則
a.創(chuàng)建對象的時候,不要直接new一個類,而是把這個new類的動作放在一個工廠的方法中,并返回.有的書上說,變量不要直接持有具體類的引用
b.不要讓類繼承具體類,而是繼承抽象類或者是實現(xiàn) interface 接口
c.不要覆蓋基類中已經(jīng)實現(xiàn)的方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巧鸭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子麻捻,更是在濱河造成了極大的恐慌纲仍,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贸毕,死亡現(xiàn)場離奇詭異郑叠,居然都是意外死亡,警方通過查閱死者的電腦和手機崖咨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門锻拘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來油吭,“玉大人击蹲,你說我怎么就攤上這事⊥裨祝” “怎么了歌豺?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長心包。 經(jīng)常有香客問我类咧,道長,這世上最難降的妖魔是什么蟹腾? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任痕惋,我火速辦了婚禮,結(jié)果婚禮上娃殖,老公的妹妹穿的比我還像新娘值戳。我一直安慰自己,他們只是感情好炉爆,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布堕虹。 她就那樣靜靜地躺著,像睡著了一般芬首。 火紅的嫁衣襯著肌膚如雪赴捞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音,去河邊找鬼署咽。 笑死麻裁,一個胖子當(dāng)著我的面吹牛泼诱,可吹牛的內(nèi)容都是我干的屿良。 我是一名探鬼主播擎勘,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼粉洼,長吁一口氣:“原來是場噩夢啊……” “哼然评!你這毒婦竟也來了仅财?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碗淌,失蹤者是張志新(化名)和其女友劉穎盏求,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿眠,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡碎罚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纳像。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荆烈。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竟趾,靈堂內(nèi)的尸體忽然破棺而出憔购,到底是詐尸還是另有隱情,我是刑警寧澤岔帽,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布玫鸟,位于F島的核電站,受9級特大地震影響犀勒,放射性物質(zhì)發(fā)生泄漏屎飘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一贾费、第九天 我趴在偏房一處隱蔽的房頂上張望钦购。 院中可真熱鬧,春花似錦褂萧、人聲如沸押桃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怨规。三九已至,卻和暖如春锡足,著一層夾襖步出監(jiān)牢的瞬間波丰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工舶得, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掰烟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像纫骑,于是被迫代替她去往敵國和親蝎亚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容