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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dahaiaaaqe/article/details/78460674

一、什么是建造者模式

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

}

猜你喜欢

转载自blog.csdn.net/dahaiaaaqe/article/details/78460674