设计模式之建造者模式

作者: 愚公要移山 | 来源:发表于2019-07-10 14:38 被阅读2次

    建造者模式其实理解起来也是比较容易的。比如工地上建房子,对于我们用户来说不需要知道房子是如何建造的,到时候我们只需要去购买就好了,对于开发商来说他只需要指挥下面的无数个包工头去建造就好了,对于包工头他就要知道知道房子的每一个细节,确保万无一失。其实这就是建造者模式,它把创建对象的一些复杂过程(建造衣服)给封装了起来,我们程序员想要new一个新的对象,只需要说出自己条件就好了。

    OK,了解了建造者模式的基本思想,下面就深入的了解一下

    一、认识建造者模式

    上面的例子如果你有点懵,没关系下面好好地理一理。使用一张图来表示一下建造者模式

    1-例子.jpg

    上面的流程梳理一下,一共有5个角色
    (1)用户:也就是我们消费者,用户提要求,要建一个什么样的房子
    (2)Director(开发商):他自己不会开发,就像万达老板一样可能不会砌墙这些,但是他找包工头去做,他只需要去调用这些包工头就造房子就好了。
    (3)Builder(抽象的包工头):给出一个抽象接口,规定房子由哪几部分组成,如何去建造。给下面的包工头一个建房子的规范。
    (4)ContreteBuilder(具体包工头):真正建房子的人,但是每一个包工头可以建不同的房子。
    (5)Product(房子):也就是我们的产品类。

    再给出一张类图看一下他们几个在类上的关系

    2-建造者模式类图.jpg

    明白了吧。如果还不清楚,在往下看,代码去演示一下。

    二、代码实现建造者模式
    我们代码实现的时候,是从后往前走的,比如说是先有房子然后建造者这些。

    第一步:定义Product(房子)

    //角色:产品类房子
    public class House {
        private String bedroom;//卧室
        private String kitchen;//厨房
        private String toilet;//厕所
        //getter和setter方法
        //toString方法
    }
    

    第二步:抽象建造者接口

    //角色:包工头
    public interface IBuilder {
        public  void buildBedroom();//建卧室
        public  void buildKitchen();//建厨房
        public  void buildToilet();//建厕所
        House retrieveResult();
    }
    

    第三步:具体建造者(这里有两个包工头A和B)

    包工头B和A是一样的代码。只是名字不同,这里就给出一个

    //角色:具体建造者(包工头A)
    public class HouseBuilderA implements IBuilder {
        //先有一个空壳子,卧室厨房厕所都没有
        private House house = new House();
        
        //开始建造卧室
        @Override
        public void buildBedroom() {
            house.setBedroom("包工头A:卧室建造成功");
        }
        //开始建造卧室
        @Override
        public void buildKitchen() {
            house.setKitchen("包工头A:厨房建造成功");
        }
        //开始建造卧室
        @Override
        public void buildToilet() {
            house.setToilet("包工头A:厕所建造成功");
        }
        //房子建好了,直接返回
        @Override
        public House retrieveResult() {
            return house;
        }
    }
    

    第四步:Director(开发商指挥者)

    //角色:director(开发商)
    public class Developer {
        //有一个包工头:具体是哪一个我不知道
        private IBuilder builder;
        //让包工头受开发商管理
        public Developer(IBuilder builder) {
            this.builder = builder;
        }
        //开发商一声令下,包工头开始造房子
        public void construct(){
            builder.buildBedroom();
            builder.buildKitchen();
            builder.buildToilet();
        }
    }
    

    第五步:用户

    //角色:用户
    public class User {
        public static void main(String[] args) {
            //创建包工头
            IBuilder builderA = new HouseBuilderA();
            IBuilder builderB = new HouseBuilderB();
            
            //创造开发商角色,给定建造者对象:A或者B
            Developer director = new Developer(builderA);
            director.construct();
           
            //制造完成:出来一个房子
            House productA = builderA.retrieveResult();
            System.out.println(productA.toString());
        }
    }
    

    三、总结

    (1)优点

    • 将产品本身与产品创建过程进行解耦,
    • 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
    • 增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。

    (2)缺点

    • 如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
    • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
      OK,建造者模式就先讲到这里,如有问题还请批评指正。

    关注微信公众号:java的架构师技术栈。回复关键字可获取java架构师、python等等各种教程资源

    相关文章

      网友评论

        本文标题:设计模式之建造者模式

        本文链接:https://www.haomeiwen.com/subject/fulhkctx.html