java设计模式:创建者模式Builder pattern

  1. 创建者模式概念(总结)
    1、要创建一个复杂对象,这个对象的创建基本过程固定(Builder接口),但是对象要创建的具体内容又是可以改变的(ConcreteBuilder:公寓房、平房)。
    2、但是直接用具体的创建者还是会暴露,对象创建的细节,因此可以引入一个设计者(Director),设计者类中有建造者对象(Builder)的引用,设计者通过调用建造对象中的方法来创建对象。设计者可以用来隐藏复杂对象的创建过程。
    3、最后会重新组装改复杂对象,即通过Builder返回创建好的复杂对象。

  2. 创建者模式的组成部分
    以建造房子为例:
    1、House类(Product)

package com.dengqi.builder;

public class House
{
    private String floor;
    private String wall;
    private String housetop;

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

}

这里如果用户要直接创建House对象的话就会new出该房子对象,然后调用set方法设置该house对象的属性,这样会有两个问题:
①:暴露对象创建的过程;
②:修改很不方便。
2、HouseBuilder(Builder)

public interface HouseBuilder {
    public void makeFloor();
    public void makeWall();
    public void makeHousetop();

    public House getHouse();
}

3、PingFangBuilder(ConcreteBuilder)

package com.dengqi.builder;

public class PingfangBuilder implements HouseBuilder
{
    House house = new House();

    @Override
    public void makeFloor()
    {
        // TODO Auto-generated method stub
        house.setFloor("平房:地板");

    }

    @Override
    public void makeWall()
    {
        // TODO Auto-generated method stub
        house.setWall("平房:墙");

    }

    @Override
    public void makeHousetop()
    {
        // TODO Auto-generated method stub
        house.setHousetop("地板");
    }

    @Override
    public House getHouse()
    {
        // TODO Auto-generated method stub
        return house;
    }

}

4、main方法中建造对象

main(String[] args) {
    HouseBuilder builder = new PingFangBuilder();
    builder.makeFloor();
    builder.makeWall();
    builder.makeHousetop();
    House house = builder.getHouse();
}

5、这样只有以上四种角色的话还是会暴ConcreteBuider的细节,这时可以引入设计者类(Director),它本身包含了一个Builder类

public class HouseDirector {

    private HouseBuilder =builder;
    public HouseDirector(HouseBuilder builder) {
        this.builder = builder
    }
    public void makeHouse(Builder builder) {
        builder.makeFloor();
        builder.makeWall();
        builder.makeHousetop();
    }
}

6、如此一来,Main方法就变成了

package com.dengqi.builder;

public class MainClass
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        HouseBuilder builder = new PingfangBuilder();
        Director director = new Director(builder);

        director.makeHouse();

        House house = builder.getHouse();

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

    }

}

7、假如你不想修平房,想修公寓了,则只要添加相应的具体的ConcreteBuilder即可

public class GongYuBuilder implements HouseBuilder {
    House house = new House();
    public void makeFloor() {
        house.setFloor("公寓:地板");
    }
    public void makeWall() {
        house.setWall("公寓:墙");
    }
    public void make() {
        house.setFloor("公寓:地板");
    }
    public getHouse() {
        return house;
    }
}

只是如果要修改其它类型的house的话,就只要修改具体Builder的方法即可。

main(String[] args) {
    HouseBuilder builder = new GongYuBuilder();
    HouseDirector director= newHouseDirector();
    House house = director.makeHouse(builder);
}
  1. 建造者模式的应用场景
    1、对象的创建:Builder模式视为对象的创建二设计的模式
    2、创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象;
    3、关注对象创建的各个部分的创建过程:不同的工厂(指concreteBuilder)对产品属性有不同的创建方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值