工厂模式+门面模式+策略模式的易懂易记示例

          代码模拟这样一个场景:客户要盖房子,需要去劳务市场找个合适的包工头来承包自己的工程,找到了合适的包工头,最后开工。

客户盖房子流程图....大概就这么个意思

 


我按照自己的理解用代码来逐一剖析、实现这个场景:

 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();
    }

}

说明:类名、枚举之类的用中文命名是为了直观,实际开发中切勿效仿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值