设计模式——建造者模式

建造者模式

建造者又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象

它允许用户只通过指定复杂对象的类型和内容就可以建造他们,不需要知道其构建细节。

建造者模式四个角色:
Product(产品角色):一个具体的产品对象
Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类
ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
Director(指挥者):构建一个使用Builder的对象,它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程

原理图:

 举个简单盖房子例子:

普通:

interface BuildHouse{
    void doBase();
    void doWalls();
    void doFloor();
}
class SmallHouse implements BuildHouse {
    public SmallHouse() {
        doBase();
        doWalls();
        doFloor();
    }
    @Override
    public void doBase() {
        System.out.println("小房子打地基");
    }

    @Override
    public void doWalls() {
        System.out.println("小房子砌墙");
    }

    @Override
    public void doFloor() {
        System.out.println("小房子盖楼");
    }
}
class Bighouse implements BuildHouse{

    public Bighouse() {
        doBase();
        doWalls();
        doFloor();
    }

    @Override
    public void doBase() {
        System.out.println("大房子打地基");
    }

    @Override
    public void doWalls() {
        System.out.println("大房子砌墙");
    }

    @Override
    public void doFloor() {
        System.out.println("大房子盖楼");
    }
}

优点:好理解 简单易操作
缺点:设计的程序结构过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案,把产品(即:房子)和创建产品的过程(房子创建流程)封装在了一起,耦合性更强

 采用建造者模式:

1.将建造过程抽离出来并抽象化

2.建造接口关联house产品类

3.按需重写相应建造流程方法

4.通过指挥者来拿到相应对象

//采用建造者模式进行改进
//房子原型对象
class House{
   private String base;
   private String walls;
   private String floor;


    public String getBase() {
        return base;
    }

    public void setBase(String base) {
        this.base = base;
    }

    public String getWalls() {
        return walls;
    }

    public void setWalls(String walls) {
        this.walls = walls;
    }

    public String getFloor() {
        return floor;
    }

    public void setFloor(String floor) {
        this.floor = floor;
    }

    @Override
    public String toString() {
        return "House{" +
                "base='" + base + '\'' +
                ", walls='" + walls + '\'' +
                ", floor='" + floor + '\'' +
                '}';
    }
}
//创建者抽象类
abstract class HouseBuilder{
//    关联对象
    House house  = new House();
    abstract void doBase();
    abstract void doWalls();
    abstract void doFloors();
//    返回house
    House getHouse(){
        doBase();
        doWalls();
        doFloors();
        return house;
    }
}
//相应创建者
class SmallHouse2 extends HouseBuilder {

    @Override
    public void doBase() {
        super.house.setBase("小地基");
        System.out.println("小房子打地基");
    }

    @Override
    public void doWalls() {
        super.house.setWalls("小墙");
        System.out.println("小房子砌墙");
    }

    @Override
    public void doFloors() {
        super.house.setFloor("小楼");
        System.out.println("小房子盖楼");
    }

}
class Bighouse2 extends HouseBuilder{


    @Override
    public void doBase() {
        super.house.setBase("大地基");
        System.out.println("大房子打地基");
    }

    @Override
    public void doWalls() {
        super.house.setWalls("大墙");
        System.out.println("大房子砌墙");
    }

    @Override
    public void doFloors() {
        super.house.setFloor("大楼");
        System.out.println("大房子盖楼");
    }
}
//管理者
class HouseDirextor{
//    聚合建造者接口
    HouseBuilder houseBuilder = null;
    public HouseDirextor(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }
    public House controllerBuildHouse(){
        House house = houseBuilder.getHouse();
        return house;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值