构造者模式

构造者模式

先复制粘贴一下构造者模式的定义:

Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

构造者有四种角色组成:

 Builder:是为创建一个Product对象的各个部件指定的抽象接口
 ConcreteBuilder:它是具体的构建者,实现Builder接口,构造和装配各个部件。
 Product:具体的产品
 Director:指挥者,它是构建一个使用Builder接口的对象。

估计很多同学都没看懂,好啦,那我们先不管那么多的定义,我们先来讲一个故事吧,故事的内容就是一个土财主盖房子的事情。

-------------------------------------------第一阶段——添加product角色(House.java)---------------------

首先有个财主,他叫main,他想盖一座房子,名曰House.java(如下)

package builder01;

 

public class House {

    //地板

    private String floor = null;

    //墙

    private String wall = null;

    //屋顶

    private String housetop = null;

   

    public String getFloor() {

       return floor;

    }

   

    public void setFloor(String floor) {

       this.floor = floor;

    }

   

    public String getWall() {

       return wall;

    }

   

    public void setWall(String wall) {

       this.wall = wall;

    }

   

    public String getHousetop() {

       return housetop;

    }

   

    public void setHousetop(String housetop) {

       this.housetop = housetop;

    }

   

}

好了,下面,财主要自己盖房子了(代码如下)

package builder01;

 

public class MainClass {

 

    public static void main(String[] args) {

       //客户直接造房子

       House house = new House();

       house.setFloor("地板");

       house.setWall("墙");

       house.setHousetop("屋顶");

    }

 

}

-----------第二阶段—添加Builder(HouseBuilder.java)与ConcreteBuilder(BungalowBuilder.java)角色---------------------------------

OK,我们看见整个过程都没问题 ,但是堂堂一个财主,自己去盖房子,貌似有点不太体面,所以这个时候需要一个施工队(HouseBuilder.java),

package builder02;

 

public interface HouseBuilder {

    //修地板

    public void makeFloor();

    //修墙

    public void makeWall();

    //修屋顶

    public void makeHousetop();

   

    public House getHouse();

}

然而HouseBuilder只是个接口,纯粹是个称谓,要盖房子还要找具体的施工队(盖平房的 施工队)

BungalowBuilder.java:

package builder02;

 

public class BungalowBuilder implements HouseBuilder {

    House  house = new House();

    @Override

    public void makeFloor() {

       house.setFloor("平房-->地板");

    }

 

    @Override

    public void makeWall() {

       house.setWall("平房-->墙");

    }

 

    @Override

    public void makeHousetop() {

       house.setHousetop("平房-->房顶");

    }

 

    @Override

    public House getHouse(){

       return house;

    }

}

好了,施工队找好之后,财主只需要指挥平房施工队来建造房子就可以了

package builder02;

 

public class MainClass {

 

    public static void main(String[] args) {

       //由工程队来修房子

       HouseBuilder builder = new BungalowBuilder();

       //调用工程队来修

       builder.makeFloor();

       builder.makeHousetop();

       builder.makeWall();

       House house = builder.getHouse();

      

       System.out.println(house.getFloor());

       System.out.println(house.getHousetop());

       System.out.println(house.getWall());

    }

 

}

但是心细的同学可能发现了,虽然财主不用自己造平房了,但是财主需要自己指挥平房施工队来建造房子,这任务依然不轻松……这个时候财主就在想,要是有一个大管家来帮他指挥,那样的话岂不是方便很多!所以下面我们就把这个大管家给请过来:

-------------第四阶段——添加Director(HouseDirector.java)角色-----------

package builder04;

 

public class HouseDirector {

    public void makeHouse(HouseBuilder houseBuilder){

       houseBuilder.makeFloor();

       houseBuilder.makeHousetop();

       houseBuilder.makeWall();

    }

}

其他的不变,这个时候财主要建造房子,只需要跟大管家(HouseDirector.java)说一声就可以了,代码如下:

package builder04;

 

public class MainClass {

    //直接在makeHouse中传houseBuilder的值,也是比较规范的

    public static void main(String[] args) {

       //建造平房

       //由工程队来修

       HouseBuilder houseBuilder = new BungalowBuilder();

       //设计者来做

       HouseDirector houseDirector = new HouseDirector();

       houseDirector.makeHouse(houseBuilder);

      

      

       House house = houseBuilder.getHouse();

      

       System.out.println(house.getFloor());

       System.out.println(house.getHousetop());

       System.out.println(house.getWall());

             

    }

 

}

OK,到此,财主建造房子的故事算是正式讲完了,其中构造者模式的每一个角色也都比较详细的跟大家介绍清楚了,so,再回头对照着原始的定义,好好地回顾一下吧~

原文地址:https://www.cnblogs.com/magicy/p/4631788.html