Java设计模型(3)——建造者模型

来源:互联网 发布:知乎怎样回答问题 编辑:程序博客网 时间:2024/06/06 20:43

一、什么是建造者模式

 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。 简单一点就是:  将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。

  举个简单的例子,如汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。

建造者模式的结构

这里写图片描述

三、建造者模式应用场景

  • 对象的创建:Builder模式是为对象的创建而设计的模式
  • 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
  • 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法

代码:
BuilerDirector.java

public class BuilerDirector {    public  void  construct(HouseBuiler h){        h.setWuDing();        h.setDiBan();        h.setYangTai();    }}

House.java

public class House {    //地板    private String diban;    //阳台    private String yangtai;    //屋顶    private String wuding;    public House() {        super();    }    public House(String diban, String yangtai, String wuding) {        super();        this.diban = diban;        this.yangtai = yangtai;        this.wuding = wuding;    }    public String getDiban() {        return diban;    }    public void setDiban(String diban) {        this.diban = diban;    }    public String getYangtai() {        return yangtai;    }    public void setYangtai(String yangtai) {        this.yangtai = yangtai;    }    public String getWuding() {        return wuding;    }    public void setWuding(String wuding) {        this.wuding = wuding;    }}

HouseBuiler.java

public interface HouseBuiler {    //修屋顶    public void setDiBan();    //修阳台    public void setYangTai();    //修屋顶    public void setWuDing();    //获取实体对象    public House getHouse();}

Main.java

public class Main {    public static void main(String[] args) {        //由工程队来修        HouseBuiler h = new PingFangBuiler();        //设计者来做        BuilerDirector b = new BuilerDirector();        b.construct(h);        House bb = h.getHouse();        System.out.println(bb.getDiban());        System.out.println(bb.getWuding());        System.out.println(bb.getYangtai());    }}

PingFangBuiler.java

public class PingFangBuiler implements HouseBuiler {    House h = new House();    @Override    public void setDiBan() {        h.setDiban("平房——地板");    }    @Override    public void setYangTai() {        h.setYangtai("平房——阳台");    }    @Override    public void setWuDing() {        h.setWuding("平房——屋顶");    }    @Override    public House getHouse() {        return h;    }}