【設(shè)計(jì)模式①】單例、原型羊异、工廠方法事秀、抽象工廠模式

環(huán)境

Java:1.8.0_202-b08
dependency:

1. 單例模式

a). 定義:

Java中單例模式定義:“一個(gè)類有且僅有一個(gè)實(shí)例,并且自行實(shí)例化向整個(gè)系統(tǒng)提供野舶∫准#”

b). 實(shí)現(xiàn)

請(qǐng)看注釋

package io.ilss.pattern.singleton;

/**
 * @author : feng
 * @description: SingletonThree
 * @date : 2019-04-11 15:42
 * @version: : 1.0
 */
public class SingletonOne {

    private final static SingletonOne INSTANCE = new SingletonOne();

    private SingletonOne(){}

    public static SingletonOne getInstance(){
        return INSTANCE;
    }

    /**
     * 第一種:餓漢式 使用靜態(tài)常量直接new
     *
     * 在類加載的時(shí)候,完成實(shí)例平道,可以避免線程同步問(wèn)題
     */
}

package io.ilss.pattern.singleton;

/**
 * @author : feng
 * @description: SingletonThree
 * @date : 2019-04-11 15:54
 * @version: : 1.0
 */
public class SingletonTwo {
    private final static SingletonTwo INSTANCE;

    static {
        INSTANCE = new SingletonTwo();
    }

    private SingletonTwo() {}

    public static SingletonTwo getInstance() {
        return INSTANCE;
    }

    /**
     * 第二種:餓漢式 使用靜態(tài)代碼塊
     *
     * 和第一種類似
     */
}

package io.ilss.pattern.singleton;

/**
 * @author : feng
 * @description: SingletonThree
 * @date : 2019-04-11 16:01
 * @version: : 1.0
 */
public class SingletonThree {
    private static SingletonThree SingletonThree;

    private SingletonThree() {}

    public static SingletonThree getInstance() {
        if (SingletonThree == null) {
            SingletonThree = new SingletonThree();
        }
        return SingletonThree;
    }

    /**
     * 第三種:懶漢式 通過(guò)getInstance方法中空判斷來(lái)實(shí)現(xiàn)
     *
     * 注:此種方法線程不安全睹欲,多線程情況 不推薦使用。
     *
     */
}

package io.ilss.pattern.singleton;

/**
 * @author : feng
 * @description: SingletonFour
 * @date : 2019-04-11 16:11
 * @version: : 1.0
 */
public class SingletonFour {

    private static SingletonFour INSTANCE;

    private SingletonFour() {
    }

    public static synchronized SingletonFour getInstance() {
        if (null == INSTANCE) {
            INSTANCE = new SingletonFour();
        }
        return INSTANCE;
    }

    /**
     * 第四種:懶漢式 使用synchronized同步鎖實(shí)現(xiàn)
     *
     * 因?yàn)槭褂昧朔椒?jí)鎖一屋,效率偏低句伶。
     */
}

package io.ilss.pattern.singleton;

/**
 * @author : feng
 * @description: SingletonFive
 * @date : 2019-04-11 16:17
 * @version: : 1.0
 */
public class SingletonFive {

    private static SingletonFive INSTANCE;

    private SingletonFive() { }

    public static SingletonFive getInstance() {
        if (null == INSTANCE) {
            synchronized (SingletonFive.class) {
                if (null == INSTANCE) {
                    INSTANCE = new SingletonFive();
                }
            }
        }
        return INSTANCE;
    }

    /**
     * 第五種 懶漢式 使用double-check(雙重檢查機(jī)制)
     *
     * 延遲加載,線程安全陆淀。 推薦使用
     */
}

package io.ilss.pattern.singleton;

/**
 * @author : feng
 * @description: SingletonSix
 * @date : 2019-04-12 09:27
 * @version: : 1.0
 */
public class SingletonSix {
    private static class Singleton {
        private static SingletonSix INSTANCE = new SingletonSix();
    }

    public static SingletonSix getInstance() {
        return Singleton.INSTANCE;
    }
    /**
     * 第六種 靜態(tài)內(nèi)部類
     *
     * 采用類裝載的機(jī)制來(lái)保證初始化實(shí)例時(shí)只有一個(gè)線程考余。
     * 靜態(tài)內(nèi)部類方式在Singleton類被裝載時(shí)并不會(huì)立即實(shí)例化,
     * 而是在需要實(shí)例化時(shí)轧苫,調(diào)用getInstance方法楚堤,才會(huì)裝載Singleton類,
     * 從而完成SingletonSix的實(shí)例化含懊。
     */
}

package io.ilss.pattern.singleton;

/**
 * @author : feng
 * @description: SingletonSeven
 * @date : 2019-04-12 09:31
 * @version: : 1.0
 */
public class SingletonSeven {
    public String string = "test";
    // 內(nèi)部枚舉類
    private enum EnumSingleton{
        // 規(guī)范要求必須有注釋身冬。。請(qǐng)忽略這個(gè)注釋岔乔,好吧 既然你看完了酥筝,那就再看兩眼?
        Singleton;
        private SingletonSeven instance;

        // 枚舉類的構(gòu)造方法在類加載時(shí)被實(shí)例化
        EnumSingleton(){
            instance = new SingletonSeven();
        }
        private SingletonSeven getInstance(){
            return instance;
        }
    }
    public static SingletonSeven getInstance() {
        return EnumSingleton.Singleton.getInstance();
    }


    /**
     * 第七種:通過(guò)內(nèi)部枚舉類實(shí)現(xiàn)
     *
     * Java保證了所有枚舉的構(gòu)造方法只會(huì)被執(zhí)行一次雏门,所以無(wú)論多少線程調(diào)用嘿歌,都只會(huì)產(chǎn)生一個(gè)實(shí)例掸掏。
     */
}

2. 原型模式

a). 定義

原型模式就是用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)復(fù)制這些原型創(chuàng)建新的對(duì)象宙帝。

淺拷貝:使用一個(gè)已知實(shí)例對(duì)新創(chuàng)建實(shí)例的成員變量逐個(gè)賦值丧凤,這個(gè)方式被稱為淺拷貝。

深拷貝:當(dāng)一個(gè)類的拷貝構(gòu)造方法步脓,不僅要復(fù)制對(duì)象的所有非引用成員變量值愿待,還要為引用類型的成員變量創(chuàng)建新的實(shí)例,并且初始化為形式參數(shù)實(shí)例值靴患。

關(guān)于淺拷貝和深拷貝 可以看 http://www.cnblogs.com/chenssy/p/3308489.html

b). 實(shí)現(xiàn)

package io.ilss.pattern.prototype;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * @author : feng
 * @description: SomeObject
 * @date : 2019-04-12 14:11
 * @version: : 1.0
 */
@Getter
@Setter
@Slf4j
public class SomeObject implements Cloneable {
    private int flag = 1;
    private String msg = "hello world!";

    /**
     * Java中的Object類提供了淺克隆的clone()方法仍侥,
     * 具體原型類只要實(shí)現(xiàn) Cloneable 接口就可實(shí)現(xiàn)對(duì)象的淺克隆
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        SomeObject object1 = new SomeObject();
        SomeObject object2 = (SomeObject) object1.clone();
        SomeObject object3 = (SomeObject) object1.clone();
        object3.setFlag(2);
        log.debug(" object 1 : {} , hashCode() : {} , toString() : {} ", object1, object1.hashCode(), object1.getMsg() + " " + object1.getFlag());
        log.debug(" object 2 : {} , hashCode() : {} , toString() : {} ", object2, object2.hashCode(), object2.getMsg() + " " + object2.getFlag());
        log.debug(" object 3 : {} , hashCode() : {} , toString() : {} ", object3, object3.hashCode(), object3.getMsg() + " " + object3.getFlag());

    }
}

②用帶原型管理器的原型模式來(lái)生成包含“圓”和“正方形”等圖形的原型

package io.ilss.pattern.prototype;

/**
 * @author : feng
 * @description: Shape
 * @date : 2019-04-12 14:42
 * @version: : 1.0
 */
interface Shape extends Cloneable {
    /**
     * 拷貝
     * @return Object
     */
    Object clone();

    /**
     * 計(jì)算面積
     * @return area
     */
    double computeArea();

}
package io.ilss.pattern.prototype;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.util.Scanner;

/**
 * @author : feng
 * @description: Circle
 * @date : 2019-04-12 14:44
 * @version: : 1.0
 */

@Getter
@Setter
@Slf4j
public class Circle implements Shape {
    double radius = 1.0;
    @Override
    public Object clone() {
        Circle circle = null;
        try {
            circle = (Circle) super.clone();
        } catch (CloneNotSupportedException e) {
            log.error("Clone Circle class failed!");
        }
        return circle;
    }

    @Override
    public double computeArea() {
        return Math.PI * radius * radius;
    }
}
package io.ilss.pattern.prototype;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * @author : feng
 * @description: Square
 * @date : 2019-04-12 14:48
 * @version: : 1.0
 */
@Getter
@Setter
@Slf4j
class Square implements Shape {
    private double length = 1.0;
    @Override
    public Object clone() {
        Square square = null;
        try {
            square = (Square) super.clone();
        } catch (CloneNotSupportedException e) {
            log.error("Clone Square class failed!");
        }
        return square;
    }

    @Override
    public double computeArea() {
        return length * length;
    }

}
package io.ilss.pattern.prototype;

import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;

import java.util.*;

/**
 * @author : feng
 * @description: PrototypeManager
 * @date : 2019-04-12 14:42
 * @version: : 1.0
 */
@Slf4j
class PrototypeManager {
    private Map<String, Shape> map = Maps.newHashMap();

    public PrototypeManager() {
        map.put("Circle", new Circle());
        map.put("Square", new Square());
    }

    public void addshape(String key, Shape obj) {
        map.put(key, obj);
    }

    public Shape getShape(String key) {
        Shape temp = map.get(key);
        return (Shape) temp.clone();
    }

    public static void main(String[] args) {
        PrototypeManager manager = new PrototypeManager();
        Shape object1 = manager.getShape("Circle");
        log.debug(" {} ", object1.computeArea());

        Shape object2 = manager.getShape("Square");
        log.debug(" {} ", object2.computeArea());

        Circle circle = (Circle) manager.getShape("Circle");
        circle.setRadius(2.2);
        Shape object3 = circle;
        log.debug(" {} ", object3.computeArea());

    }
}

3. 工廠方法模式

a). 定義

工廠方法模式是簡(jiǎn)單工廠模式的衍生,解決了許多簡(jiǎn)單工廠模式的問(wèn)題。首先完全實(shí)現(xiàn)‘開-閉 原則’凯砍,實(shí)現(xiàn)了可擴(kuò)展。其次更復(fù)雜的層次結(jié)構(gòu),可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場(chǎng)合魔种。

簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例柒爵。
簡(jiǎn)單工廠模式是工廠模式中最簡(jiǎn)單實(shí)用的模式根悼,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)。
簡(jiǎn)單工廠模式又稱靜態(tài)工廠方法模式格了。它存在的目的很簡(jiǎn)單:定義一個(gè)用于創(chuàng)建對(duì)象的接口看铆。

工廠方法模式中考慮的是一類產(chǎn)品的生產(chǎn),如畜牧場(chǎng)只養(yǎng)動(dòng)物盛末、電視機(jī)廠只生產(chǎn)電視機(jī)弹惦、計(jì)算機(jī)軟件學(xué)院只培養(yǎng)計(jì)算機(jī)軟件專業(yè)的學(xué)生

工廠方法模式的主要角色如下。

  • 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口悄但,調(diào)用者通過(guò)它訪問(wèn)具體工廠的工廠方法 newProduct() 來(lái)創(chuàng)建產(chǎn)品棠隐。
  • 具體工廠(ConcreteFactory):主要是實(shí)現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建檐嚣。
  • 抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范助泽,描述了產(chǎn)品的主要特性和功能。
  • 具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口嚎京,由具體工廠來(lái)創(chuàng)建嗡贺,它同具體工廠之間一一對(duì)應(yīng)。


    在這里插入圖片描述

b). 實(shí)現(xiàn)

Product

package io.ilss.pattern.factorymethod;

/**
 * @author : feng
 * @description: Product 抽象產(chǎn)品
 * @date : 2019-04-12 16:10
 * @version: : 1.0
 */
interface Product {
    public void show();
}
ConcreteProduct

package io.ilss.pattern.factorymethod;

import lombok.extern.slf4j.Slf4j;

/**
 * @author : feng
 * @description: ConcreteProductOne 產(chǎn)品1
 * @date : 2019-04-12 16:11
 * @version: : 1.0
 */
@Slf4j
class ConcreteProductOne implements Product {
    private String name = "One";
    @Override
    public void show() {
        log.info("Product {} show()", name);
    }
}
package io.ilss.pattern.factorymethod;

import lombok.extern.slf4j.Slf4j;

/**
 * @author : feng
 * @description: ConcreteProductOne 產(chǎn)品2
 * @date : 2019-04-12 16:11
 * @version: : 1.0
 */
@Slf4j
class ConcreteProductTwo implements Product {
    private String name = "Two";
    @Override
    public void show() {
        log.info("Product {} show()", name);
    }
}

AbstractFactory

package io.ilss.pattern.factorymethod;

/**
 * @author : feng
 * @description: ProductAbstractFactory 抽象工廠
 * @date : 2019-04-12 16:13
 * @version: : 1.0
 */
public interface ProductAbstractFactory {

    /**
     * 生產(chǎn)產(chǎn)品
     * @return Product
     */
    Product newProduct();

}

ConcreteFactory

package io.ilss.pattern.factorymethod;

/**
 * @author : feng
 * @description: ProductConcreteOneFactory 具體工廠1
 * @date : 2019-04-12 16:15
 * @version: : 1.0
 */
public class ProductConcreteOneFactory implements ProductAbstractFactory {

    @Override
    public Product newProduct() {
        return new ConcreteProductOne();
    }
}
package io.ilss.pattern.factorymethod;

/**
 * @author : feng
 * @description: ProductConcreteTwoFactory 具體工廠2
 * @date : 2019-04-12 16:16
 * @version: : 1.0
 */
public class ProductConcreteTwoFactory implements ProductAbstractFactory {
    @Override
    public Product newProduct() {
        return new ConcreteProductTwo();
    }
}

4. 抽象工廠模式

a). 定義

  • 抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)鞍帝。抽象工廠模式是指當(dāng)有多個(gè)抽象角色時(shí)诫睬,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個(gè)接口帕涌,使客戶端在不必指定產(chǎn)品的具體的情況下摄凡,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象续徽。根據(jù)里氏替換原則,任何接受父類型的地方架谎,都應(yīng)當(dāng)能夠接受子類型炸宵。因此,實(shí)際上系統(tǒng)所需要的谷扣,僅僅是類型與這些抽象產(chǎn)品角色相同的一些實(shí)例土全,而不是這些抽象產(chǎn)品的實(shí)例。換言之会涎,也就是這些抽象產(chǎn)品的具體子類的實(shí)例裹匙。工廠類負(fù)責(zé)創(chuàng)建抽象產(chǎn)品的具體子類的實(shí)例。

里氏替換原則:

  • 里氏替換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一末秃。 里氏替換原則中說(shuō)概页,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)练慕。 LSP是繼承復(fù)用的基石惰匙,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受到影響時(shí)铃将,基類才能真正被復(fù)用项鬼,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。

如此劲阎,問(wèn)題產(chǎn)生了:“我們?nèi)绾稳ザ攘坷^承關(guān)系的質(zhì)量绘盟?”

Liskov于1987年提出了一個(gè)關(guān)于繼承的原則** “Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“繼承必須確保超類所擁有的性質(zhì)在子類中仍然成立∶跸桑” **也就是說(shuō)龄毡,當(dāng)一個(gè)子類的實(shí)例應(yīng)該能夠替換任何其超類的實(shí)例時(shí),它們之間才具有is-A關(guān)系锡垄。

該原則稱為L(zhǎng)iskov Substitution Principle——里氏替換原則沦零。

  • 抽象工廠是一種為訪問(wèn)類提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對(duì)象的接口,且訪問(wèn)類無(wú)須指定所要產(chǎn)品的具體類就能得到同族的不同等級(jí)的產(chǎn)品的模式結(jié)構(gòu)货岭。

  • 抽象工廠模式是工廠方法模式的升級(jí)版本蠢终,工廠方法模式只生產(chǎn)一個(gè)等級(jí)的產(chǎn)品,而抽象工廠模式可生產(chǎn)多個(gè)等級(jí)的產(chǎn)品茴她。

b). 實(shí)現(xiàn)

在這里插入圖片描述
package io.ilss.pattern.abstractfactory;

/**
 * @author : feng
 * @description: ProductOne 抽象產(chǎn)品 1
 * @date : 2019-04-12 16:10
 * @version: : 1.0
 */
interface ProductOne {
    public void show();
}


package io.ilss.pattern.abstractfactory;

/**
 * @author : feng
 * @description: ProductOne 抽象產(chǎn)品 2
 * @date : 2019-04-12 16:10
 * @version: : 1.0
 */
interface ProductTwo {
    public void show();
}
package io.ilss.pattern.abstractfactory;

import lombok.extern.slf4j.Slf4j;

/**
 * @author : feng
 * @description: ConcreteProductOneOne 產(chǎn)品1 廠商1
 * @date : 2019-04-12 16:46
 * @version: : 1.0
 */
@Slf4j
public class ConcreteProductOneOne implements ProductOne {
    private String name = "OneOne";
    @Override
    public void show() {
        log.info("Product {} show()", name);
    }
}
package io.ilss.pattern.abstractfactory;

import lombok.extern.slf4j.Slf4j;

/**
 * @author : feng
 * @description: ConcreteProductOneTwo 產(chǎn)品1 廠商2
 * @date : 2019-04-12 16:46
 * @version: : 1.0
 */
@Slf4j
public class ConcreteProductOneTwo implements ProductOne {
    private String name = "OneTwo";
    @Override
    public void show() {
        log.info("Product {} show()", name);

    }
}
package io.ilss.pattern.abstractfactory;

import lombok.extern.slf4j.Slf4j;

/**
 * @author : feng
 * @description: ConcreteProductTwoOne 產(chǎn)品2 廠商1
 * @date : 2019-04-12 16:46
 * @version: : 1.0
 */
@Slf4j
public class ConcreteProductTwoOne implements ProductTwo {
    private String name = "TwoOne";
    @Override
    public void show() {
        log.info("Product {} show()", name);

    }
}
package io.ilss.pattern.abstractfactory;

import lombok.extern.slf4j.Slf4j;

/**
 * @author : feng
 * @description: ConcreteProductTwoTwo 產(chǎn)品2 廠商2
 * @date : 2019-04-12 16:46
 * @version: : 1.0
 */
@Slf4j
public class ConcreteProductTwoTwo implements ProductTwo {
    private String name = "TwoTwo";
    @Override
    public void show() {
        log.info("Product {} show()", name);

    }
}
package io.ilss.pattern.abstractfactory;

/**
 * @author : feng
 * @description: AbstractFactory 抽象工廠
 * @date : 2019-04-12 16:43
 * @version: : 1.0
 */
interface AbstractFactory
{
    public ProductOne newProductOne();
    public ProductTwo newProductTwo();
}
package io.ilss.pattern.abstractfactory;

/**
 * @author : feng
 * @description: ProductConcreteOneFactory 工廠1
 * @date : 2019-04-12 16:44
 * @version: : 1.0
 */
public class ProductConcreteOneFactory {
    public ProductOne newProductOne() {
        return new ConcreteProductOneOne();
    }

    public ProductTwo newProductTwo() {
        return new ConcreteProductTwoOne();
    }
}
package io.ilss.pattern.abstractfactory;

/**
 * @author : feng
 * @description: ProductConcreteTwoFactory 工廠2
 * @date : 2019-04-12 16:44
 * @version: : 1.0
 */
public class ProductConcreteTwoFactory {
    public ProductOne newProductOne() {
        return new ConcreteProductOneTwo();
    }

    public ProductTwo newProductTwo() {
        return new ConcreteProductTwoTwo();
    }
}

參考文章

  1. http://c.biancheng.net/view/1343.html
  2. https://baike.baidu.com/item/%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F/4941014?fr=aladdin
  3. https://www.cnblogs.com/zhaoyan001/p/6365064.html
  4. http://www.cnblogs.com/garryfu/p/7976546.html
  5. http://c.biancheng.net/view/1348.html
  6. https://baike.baidu.com/item/%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F/2361103?fr=aladdin
  7. http://www.cnblogs.com/forlina/archive/2011/06/21/2086114.html
  8. https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F
  9. http://c.biancheng.net/view/1351.html
  10. http://www.reibang.com/p/7deb64f902db
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寻拂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丈牢,更是在濱河造成了極大的恐慌祭钉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件己沛,死亡現(xiàn)場(chǎng)離奇詭異慌核,居然都是意外死亡距境,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門垮卓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)垫桂,“玉大人,你說(shuō)我怎么就攤上這事粟按∥芴玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵灭将,是天一觀的道長(zhǎng)疼鸟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)庙曙,這世上最難降的妖魔是什么空镜? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮捌朴,結(jié)果婚禮上吴攒,老公的妹妹穿的比我還像新娘。我一直安慰自己砂蔽,他們只是感情好洼怔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著察皇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泽台。 梳的紋絲不亂的頭發(fā)上什荣,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音怀酷,去河邊找鬼稻爬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜕依,可吹牛的內(nèi)容都是我干的桅锄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼样眠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼友瘤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起檐束,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辫秧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后被丧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盟戏,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绪妹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柿究。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邮旷。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝇摸,靈堂內(nèi)的尸體忽然破棺而出婶肩,到底是詐尸還是另有隱情,我是刑警寧澤探入,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布狡孔,位于F島的核電站,受9級(jí)特大地震影響蜂嗽,放射性物質(zhì)發(fā)生泄漏苗膝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一植旧、第九天 我趴在偏房一處隱蔽的房頂上張望辱揭。 院中可真熱鬧,春花似錦病附、人聲如沸问窃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)域庇。三九已至,卻和暖如春覆积,著一層夾襖步出監(jiān)牢的瞬間听皿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工宽档, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尉姨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓吗冤,卻偏偏與公主長(zhǎng)得像又厉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椎瘟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • 文章部分內(nèi)容轉(zhuǎn)載自:http://blog.csdn.net/zhangerqing 一覆致、設(shè)計(jì)模式的分類 總體來(lái)說(shuō)...
    j_cong閱讀 2,068評(píng)論 0 20
  • 原文鏈接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤獨(dú)雜貨鋪閱讀 1,517評(píng)論 0 3
  • 一、設(shè)計(jì)模式的分類 總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類: 創(chuàng)建型模式肺蔚,共五種:工廠方法模式篷朵、抽象工廠模式、單例模式、建造者...
    RamboLI閱讀 751評(píng)論 0 1
  • 光妹來(lái)到我家說(shuō):“胖子要出來(lái)了声旺”柿矗” 我媽沒搭話,只央她坐下腮猖。 光妹是本莊人〖ǎ現(xiàn)下兒子已娶了媳婦。兩個(gè)女兒也都成了人...
    一蟲杉_閱讀 893評(píng)論 0 0
  • 臨摹中 沒有打燈光 來(lái)張打燈光的枪狂,嘻嘻(˙︶˙)
    寵就好了閱讀 238評(píng)論 0 0