温故而知新之——设计模式(五)

建造者模式

建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个Builder类会一步一步构造最终的对象。该Builder类是独立于其他对象的。

 

用简单语言翻译一下:在软件开发中有时候需要创建一个非常复杂的对象,这个对象通常是有多个子对象按一定逻辑组合而成的。就像汽车流水线,安装骨架、安装引擎、安装邮箱、安装轮胎等等。最后的客户就要一台组装好的车,根本不关心到底车是怎么被安装的。这种场景下建造者模式就被发明出来了。

 

建造者模式的主要优点:

  1. 各个具体的建造者相互独立,这有利于系统的扩展。
  2. 客户端不必知道产品内部组成的细节,有利于控制细节风险。

 

建造者模式的缺点:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,该模式会增加很多的建造者类。

 

结构与实现

建造者(Builder)模式的主要角色如下。

产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。

抽象建造者(Builder):它是包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法getResult()。

具体建造者(Concrete Builder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。

指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

 

 

模式的实现

需求:用户客厅装修,包含墙体装修,电视机购买与安装,沙发的购买与布局等。

public class ConcreteDecrator1 extends Decorator{

    @Override

    public void buildWall() {

        product.setWall(" this is white wall");

    }

 

    @Override

    public void buildTV() {

        product.setTV(" this is 44 white TV");

    }

 

    @Override

    public void builidSofa() {

        product.setSofa(" this is white sofa");

    }

 

 

public class ConcreteDecrator2 extends Decorator{

    @Override

    public void buildWall() {

        product.setWall(" this is black wall");

    }

 

    @Override

    public void buildTV() {

        product.setTV(" this is 44 black TV");

    }

 

    @Override

    public void builidSofa() {

        product.setSofa(" this is black sofa");

    }

}

 

abstract class Decorator {

    protected Parlour product = new Parlour();

 

    public abstract void buildWall();

    public abstract void buildTV();

    public abstract void builidSofa();

 

    public Parlour getResult(){

        return product;

    }

}

 

public class Parlour {

    private String wall;

    private String TV;

    private String sofa;

 

 

    public void show(){

        System.out.println(wall);

        System.out.println(TV);

        System.out.println(sofa);

    }

 

 

 

 

    public String getWall() {

        return wall;

    }

 

    public void setWall(String wall) {

        this.wall = wall;

    }

 

    public String getTV() {

        return TV;

    }

 

    public void setTV(String TV) {

        this.TV = TV;

    }

 

    public String getSofa() {

        return sofa;

    }

 

    public void setSofa(String sofa) {

        this.sofa = sofa;

    }

}

 

public class ParlourDecorator {

    public static void main(String[] args) {

        Decorator decorator = new ConcreteDecrator1();

        ProjectManager projectManager = new ProjectManager(decorator);

        final Parlour decorate = projectManager.decorate();

        decorate.show();

    }

}

 

public class ProjectManager {

    private Decorator builder;

    public ProjectManager(Decorator builder){

        this.builder = builder;

    }

 

    public Parlour decorate(){

        builder.buildWall();

        builder.buildTV();

        builder.builidSofa();

        return builder.getResult();

    }

}

项目源代码:https://github.com/loveflywei/design-pattern

 

总结:

建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将他们组合在一起的算法却相对稳定。

 

一个人想要获得好运气,就必须付出5倍的努力,仅仅努力还不够,因为大家都在努力,所以要付出不亚于任何人的努力!——语出《干法》与《态度》 与诸君共勉

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蒋聊技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值