Java - 建造者模式

-- 创建者模式即隐藏复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

一、模式结构

组成(角色)关系作用
抽象创建者(Builder)具体创建者的父类提供产品创建的方法接口
具体创建者(Concrete Builder)创建者实例,不同的角色不同的角色实现不同的逻辑,最后得提供返回产品实例的方法
产品(Product)由具体创建者角色创建并返回提供产品的各功能方法,其复杂性被隐藏
指导者(Director)产品与具体创建者中间件调用具体创建者角色的方法,并给予产品功能属性

二、结构栗子

1、抽象创建者 - 房子建造者

2、具体创建者 - 只会造别墅的/只会造公寓的

3、产品 - 房子

4、指导者 - 指挥者

三、建造者模式优缺点

1、优点

  • 隐藏了复杂对象的创建过程,客户端无需知道内部细节。
  • 扩展性高,创建者之间相互独立

2、缺点

  • 暂时未发现 (请大神告知)

四、栗子

1、抽象创建者 - 房子建造者

package com.builder;

public interface HouseBuilder {

    void doorMaterial();

    void floorMaterial();

    House getHouse();

}

2、具体创建者 - 别墅建造者

package com.builder;

/**
 * @description: 别墅创建者
 * @author: ziHeng
 * @create: 2018-08-05 17:07
 **/
public class VillaBuilder implements HouseBuilder{

    private House house = new House();

    //选择门的材料
    @Override
    public void doorMaterial() {
        house.setDoor("大门选择了金刚石");
    }

    //选择屋顶的材料
    @Override
    public void floorMaterial() {
        house.setFloor("屋顶选择艾德曼金属");
    }

    //返回产品实例的方法
    @Override
    public House getHouse() {
        return house;
    }

}

3、产品 - 房子

package com.builder;

/**
 * @description: 房子
 * @author: ziHeng
 * @create: 2018-08-05 17:04
 **/
public class House {

    private String floor;

    private String door;

    private String result;

    public String getFloor() {
        return floor;
    }

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

    public String getDoor() {
        return door;
    }

    public void setDoor(String door) {
        this.door = door;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }
}

4、指导者

package com.builder;

/**
 * @description: 指挥者
 * @author: ziHeng
 * @create: 2018-08-05 17:15
 **/
public class HouseDirector {

    public static void makeHouse(HouseBuilder houseBuilder){
        System.out.println("选择材料");
        houseBuilder.doorMaterial();
        houseBuilder.floorMaterial();
        System.out.println("材料选择完毕……");
        if(houseBuilder.getClass().getSimpleName().equalsIgnoreCase("VillaBuilder")){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            houseBuilder.getHouse().setResult("资金不足,建房项目取消");
            System.out.println("资金不足,无法创建别墅");
        }else {
            houseBuilder.getHouse().setResult("建房成功");
        }

    }

}

调用Test类:

package com.builder;

/**
 * @description: 建造者模式
 * @author: ziHeng
 * @create: 2018-08-05 16:50
 **/
public class BuilderTest {

    public static void main(String[] args) {

        HouseBuilder houseBuilder = new VillaBuilder();
        HouseDirector.makeHouse(houseBuilder);


        System.out.println("-------");
        System.out.println("获取产品-房屋实例");
        House house = houseBuilder.getHouse();
        System.out.println(house.getDoor());
        System.out.println(house.getFloor());
        System.out.println(house.getResult());
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值