工廠模式+門面模式+策略模式的易懂易記示例

          代碼模擬這樣一個場景:客戶要蓋房子,需要去勞務市場找個合適的包工頭來承包自己的工程,找到了合適的包工頭,最後開工。

客戶蓋房子流程圖....大概就這麼個意思

 


我按照自己的理解用代碼來逐一剖析、實現這個場景:

 1、蓋房子的步驟都是大同小異的,比如所有的蓋房子都是打地基、壘磚

     

/**
 * @Auther: liuzujie
 * @Date: 2020/4/29 20:24
 * @Desc:  建房子的步驟都大同小異,每個包工頭都會按照自己的方式去實現這些步驟(策略模式)
 */
public interface BuildHouse {

    String 打地基();

    String 壘磚();

}

  2、每個包工頭都會有自己的蓋房子策略(比如有包工頭張三、李四)

/**
 * @Auther: liuzujie
 * @Date: 2020/4/29 20:28
 * @Desc: 張三號稱自己在包工頭界天下第一
 */
public class 包工頭張三 implements BuildHouse {
    @Override
    public String 打地基() {
        return "我們團隊打地基是天下第一";
    }
    
    @Override
    public String 壘磚() {
        return "我們團隊壘磚是天下第一";
    }

}
/**
 * @Auther: liuzujie
 * @Date: 2020/4/29 20:29
 * @Desc: 李四號稱自己在包工頭界舉世無雙
 */
public class 包工頭李四 implements BuildHouse {
    @Override
    public String 打地基() {
        return "我們團隊打地基是舉世無雙";
    }

    @Override
    public String 壘磚() {
        return "我們團隊壘磚是舉世無雙";
    }
}

3、客戶在包工頭界也沒有認識的人,所以只能去勞務市場找了。所有的包工頭都在勞務市場註冊在案,所以我們先來個枚舉類來標識所有的包工頭

/**
 * @Auther: liuzujie
 * @Date: 2020/4/29 20:34
 * @Desc: 所有在勞務市場註冊的包工頭(枚舉標識類)
 */
public enum RegisterMarket {

    張三("ZS"), 李四("LS");

    private String name;

    RegisterMarket(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

4、對客戶這種包工頭界沒有熟人的來說,勞務市場其實就是個門面。客戶在勞務市場找到合適的包工頭後,就可以蓋房子了,看代碼及註釋:



/**
 * @Auther: liuzujie
 * @Date: 2020/4/29 20:39
 * @Desc: 勞務市場,很多包工頭都在這等客戶談生意(門面類)
 */
public class LabourMarket {

    private BuildHouse buildHouse; //客戶選的包工頭蓋房子
    private RegisterMarket registerMarket; //客戶選的包工頭

    /**
     * @Auther: liuzujie
     * @Date: 2020/4/29 20:40
     * @Desc: 客戶從市場裏選一個註冊在案的包工頭標識,然後工廠模式返回這個包工頭實例
     */
    public LabourMarket(RegisterMarket registerMarket) {
        this.registerMarket = registerMarket;
        this.buildHouse = BuildHourseFactory.getSomeOne(registerMarket);
    }

    public void Building() {
        if (buildHouse == null) System.err.println("沒這號人~~~躺在空指針的血泊中..");
        System.out.println(buildHouse.打地基() + "\n" + buildHouse.壘磚());
    }


    /**
     * @Auther: liuzujie
     * @Date: 2020/4/29 20:39
     * @Desc: 根據客戶選的人產生這個人蓋房子對象(工廠模式)
     */
    private static final class BuildHourseFactory {
        public static BuildHouse getSomeOne(RegisterMarket market) {
            if (market == null) return null;
            switch (market) {
                case 張三:
                    System.out.println("我張三舉世無雙");
                    return new 包工頭張三();
                case 李四:
                    System.out.println("我李四登峯造極");
                    return new 包工頭張三();
                default:
                    return null;
            }
        }

    }
}

5、最後main方法:

/**
 * @Auther: liuzujie
 * @Date: 2020/4/29 20:43
 * @Desc: 我要蓋房子,我是客戶,我要去勞務市場找個合適的包工頭。
 */
public class Client {

    public static void main(String[] args) {
        //到了市場後找個包工頭給我建房子(客戶只需要確定包工頭就行了,其他都交給門面)
        LabourMarket market = new LabourMarket(RegisterMarket.李四);
        market.Building();
    }

}

說明:類名、枚舉之類的用中文命名是爲了直觀,實際開發中切勿效仿。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章