建造者(构造器)模式--设计模式

今天将讲述设计模式的另一篇--建造者(构造器)模式,网上的资料也有很多,但感觉都是大而同,小而不同,希望本篇可以为大家增加点对建造者模式的认识和理解.

介绍

1.1 建造者(构建器)模式

建造者(构建器)--Builder模式, 是将一个复杂对象的构建与表示相分离,是的同样的构建过程可以有不同的创建表示.

将一个复杂的对象分解了多个简单的对象, 然后一步步的构建成.达到了将变与不变相分离, 即组成部分是不变的, 但是是每一部分又可以达到灵活选择.

Builder模式隐藏了复杂对象的创建过程, 将复杂对象在创建过程加以抽象, 通过子类基础或重载的方式,动态创建具有符合属性的对象.

1.2 Builder优缺点

优点

  • 各个具体的构建器都是相互独立的, 利于系统的扩展
  • 客户端不必知道具体产品内部的实现

缺点

  • 产品组成部分必须要相同, 限制了使用范围
  • 假如产品内部变化复杂, 会增加更多的建造者类

Builder模式和工厂模式的关注点是不同的, Builder模式更注重产品零件的组装过程, 而工厂模式更加注重产品零件的创建过程, 两者是可以结合起来使用的

1.3 适用场景

  • 隔离复杂对象的创建和使用,同样的方法不同的执行顺序,从而产生不同事件的结果
  • 初始化对象时,参数很多或者很多参数都具有默认值
  • 不适合创建差异化很大的产品类,如果产品内部变化负责时,会导致定义很多建造者来实现变化,增加类的数量,增加了运行成本

 

结构和实现

Builder模式有产品、具体构造者、抽象构造者以及指挥者四个元素组成。

2.1 角色

Builder模式主要的角色如下

  • 产品角色(Product):是包含多个组成部件的复杂对象,而有具体的建造者来创建其各自的部件
  • 抽象建造者(Builder):一个包含创建产品各个子部件抽象方法的一个接口,通常还包含返回产品的方法getProduct()
  • 具体构造者(Concrete Builder):用来实现Builder接口,完成复杂产品各个子部件的具体创建方法
  • 指挥者(Director):完成复杂对象的创建以及装配,指挥中不会涉及具体产品的信息。

2.2 结构

而UML类图

 

结构代码

2.2.1 产品角色:包含多个组成部件的复杂对象

class Product
{
    private String partA;
    private String partB;
    private String partC;
    public void setPartA(String partA)
    {
        this.partA=partA;
    }
    public void setPartB(String partB)
    {
        this.partB=partB;
    }
    public void setPartC(String partC)
    {
        this.partC=partC;
    }
    public void show()
    {
        //显示产品的特性
    }
}

2.2.2 抽象建造者:包含创建各个子部件的抽象方法

abstract class Builder
{
    //创建产品对象
    protected Product product=new Product();
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();
    //返回产品对象
    public Product getResult()
    {
        return product;
    }
}

2.2.3 具体建造者:实现抽象建造者

public class ConcreteBuilder extends Builder
{
    public void buildPartA()
    {
        product.setPartA("建造 PartA");
    }
    public void buildPartB()
    {
        product.setPartA("建造 PartB");
    }
    public void buildPartC()
    {
        product.setPartA("建造 PartC");
    }
}

2.2.4 指挥者:调用建造者方法完成对复杂对象的创建过程。

class Director
{
    private Builder builder;
    public Director(Builder builder)
    {
        this.builder=builder;
    }
    //产品构建与组装方法
    public Product construct()
    {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder.getResult();
    }
}

 2.2.5 客户端

public class Client
{
    public static void main(String[] args)
    {
        Builder builder=new ConcreteBuilder();
        Director director=new Director(builder);
        Product product=director.construct();
        product.show();
    }
}

 

实例:用Builder模式创建共享单车的例子

3.1 产品类:包含多个组成部件的复杂对象

车包括架构,座位以及轮胎。

public class Bike { 

    private IFrame frame; 
    private ISeat seat; 
    private ITire tire; 
    
    public IFrame getFrame() { 
        return frame; 
    } 
    public void setFrame(IFrame frame) { 
        this.frame = frame; 
    } 
    public ISeat getSeat() { 
        return seat; 
    } 
    public void setSeat(ISeat seat) { 
        this.seat = seat; 
    } 
    public ITire getTire() { 
        return tire; 
    } 
    public void setTire(ITire tire) { 
        this.tire = tire; 
    } 
} 

3.2 Builder:包含创建产品各个子部件抽象方法的一个接口

包含返回产品的方法getProduct()

// 抽象 builder 类 
public abstract class Builder { 
    abstract void buildFrame(); 
    abstract void buildSeat(); 
    abstract void buildTire(); 
    abstract Bike createBike(); 
}

3.3 ConcreteBuilder类:用来实现Builder接口

完成复杂产品各个子部件的具体创建方法

// 具体 builder 类 
public class MobikeBuilder extends Builder{ 
    private Bike mBike = new Bike(); 
    @Override 
    void buildFrame() { 
        mBike.setFrame(new AlloyFrame()); 
    } 
    @Override 
    void buildSeat() { 
        mBike.setSeat(new DermisSeat()); 
    } 
    @Override 
    void buildTire() { 
        mBike.setTire(new SolidTire()); 
    } 
    @Override 
    Bike createBike() { 
        return mBike; 
    } 
} 

public class OfoBuilder extends Builder{ 
    private Bike mBike = new Bike(); 
    @Override 
    void buildFrame() { 
        mBike.setFrame(new CarbonFrame()); 
    } 
    @Override 
    void buildSeat() { 
        mBike.setSeat(new RubberSeat()); 
    } 
    @Override 
    void buildTire() { 
        mBike.setTire(new InflateTire()); 
    } 
    @Override 
    Bike createBike() { 
        return mBike; 
    } 
} 

3.4 指挥类:完成复杂对象的创建以及装配

指挥中不会涉及具体产品的信息。

public class Director { 
    private Builder mBuilder = null; 
    public Director(Builder builder) { 
        mBuilder = builder; 
    } 
    public Bike construct() { 
        mBuilder.buildFrame(); 
        mBuilder.buildSeat(); 
        mBuilder.buildTire(); 
        return mBuilder.createBike(); 
    } 
}

3.5 客户端调用

 

public class Click { 
    public static void main(String[] args) { 
        showBike(new OfoBuilder()); 
        showBike(new MobikeBuilder()); 
    } 
    private void showBike(Builder builder) {
        Director director = new Director(builder); 
        Bike bike = director.construct(); 
        bike.getFrame().frame(); 
        bike.getSeat().seat(); 
        bike.getTire().tire(); 
    } 
} 

 

总结扩展

Builder模式在应用过程中可以根据需求需要改变,如果创建的产品类只有一种,只需要一个具体建造者,可以省略抽象建造者,甚至可以去除指挥者的角色。

通过上述讲解,希望大家对设计模式--构造器(建造者)--Builder模式有所理解!!!

 

 

posted @ 2019-11-25 22:49  国孩  阅读(1198)  评论(0编辑  收藏  举报