设计模式 - 建造者模式(二)

 上一篇文章中我们介绍了一个完整的建造者模式的创建和使用过程,过程中完整的定义了各个参与者的职责和需要完成的工作:

Builder:定义了建筑队可以完成的建造动作,并且可以返回最终完成的房子

ConCreateBuilder:具体实现了建筑队的工作过程

Director:包工头指导建筑队如何去完成房子的建造

Home:实际需要被建造出来的东西。


接下来我们来看一下建造者模式的几个简化变种:

一、我要求建造房子,并且我自己知道如何去建造门、窗、地板,可以直接告诉建筑队去做就会变成这样,也可以直接找建筑队拿到房子

public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Builder builder = new ConCreateBuilder();
        builder.buildWindow("window 1");
        builder.buildFloor("floor m");
        builder.buildDoor("door n");
        // Director director = new Director(builder);
        Home home = builder.buildHome();
        home.speak();
    }
}
从上面可以看出,我直接与建筑队沟通,告诉他们怎么去做,并且我直接找Builder拿回了我需要的Home,这样中间就舍弃掉了Director的过程,省去了包工头的事情。

二、在第一种情况的基础上,当我要一所房子的时候,我被要求建造这样的房子必须使用这一只建筑队,也就是说我的房子和这一个建筑队被绑定在一起了,那么Home就变成了这样:

public class Home {
    Window window;// 有一扇窗子
    Door door;// 有一扇门
    Floor floor;// 有地板

    public Home() {
        // TODO Auto-generated constructor stub
        window = new Window();
        door = new Door();
        floor = new Floor();
    }

    class Window {
        String windowName;
    }

    class Door {
        String doorName;
    }

    class Floor {
        String floorName;
    }

    public void speak() {
        System.out.println("i am home , my window is " + window.windowName + ", door is " + door.doorName
                + ", floor is " + floor.floorName);
    }

    static class ConCreateBuilder implements Builder {

        Home home;

        public ConCreateBuilder() {
            // TODO Auto-generated constructor stub
            home = new Home();
        }

        @Override
        public void buildWindow(String windowName) {
            // TODO Auto-generated method stub
            home.window.windowName = windowName;
        }

        @Override
        public void buildDoor(String doorName) {
            // TODO Auto-generated method stub
            home.door.doorName = doorName;
        }

        @Override
        public void buildFloor(String floorName) {
            // TODO Auto-generated method stub
            home.floor.floorName = floorName;
        }

        @Override
        public Home buildHome() {
            // TODO Auto-generated method stub
            return home;
        }
    }
}
ConCreateBuilder成了Home的内部类

public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // Builder builder = new ConCreateBuilder();
        // Director director = new Director(builder);
        Home.ConCreateBuilder homeBuilder = new Home.ConCreateBuilder();
        homeBuilder.buildWindow("window 1");
        homeBuilder.buildFloor("floor m");
        homeBuilder.buildDoor("door n");
        Home home = homeBuilder.buildHome();
        home.speak();
    }
}
在使用时,直接new一个Home的内部类Builder出来,然后给builder设置各个部件的内容。

看上面的代码,从调用上来看代码还不够简洁,做一定量的修改之后,可以使得代码的简洁性大大提高:

    static class ConCreateBuilder implements Builder {

        Home home;

        public ConCreateBuilder() {
            // TODO Auto-generated constructor stub
            home = new Home();
        }

        @Override
        public Builder buildWindow(String windowName) {
            // TODO Auto-generated method stub
            home.window.windowName = windowName;
            return this;
        }

        @Override
        public Builder buildDoor(String doorName) {
            // TODO Auto-generated method stub
            home.door.doorName = doorName;
            return this;
        }

        @Override
        public Builder buildFloor(String floorName) {
            // TODO Auto-generated method stub
            home.floor.floorName = floorName;
            return this;
        }

        @Override
        public Home buildHome() {
            // TODO Auto-generated method stub
            return home;
        }
    }
通过这样return this的修改,在使用的时候就变成了这样

        Home.ConCreateBuilder homeBuilder = new Home.ConCreateBuilder();
        homeBuilder.buildWindow("window 1").buildFloor("floor m").buildDoor("door n");
        Home home = homeBuilder.buildHome();
咦,看起来是不是特别眼熟~~

没错,做过android的小伙伴们看出来了,这个和AlertDialog的创建模式简直一毛一样:

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setIcon(R.drawable.launcher).setMessage(R.string.message);
        AlertDialog dialog = builder.create();
在android中,很多很多地方都用到了建造者模式。

我也是刚刚接触。还有很多地方理解的不够,不深刻,也许还有很多不对的地方,还请来过得大神们,不吝赐教。

三人行,必有我师焉~





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值