建造者模式

Posted lovebolin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建造者模式相关的知识,希望对你有一定的参考价值。

也叫做生成器模式,其定义如下:讲一个复杂的对象构建与他的表示分离,使得同样的创建过程可以创建不同的表示。

在建造者模式中,有四个角色:

  • Product产品模型类

 通常是实现了模板方法,也就是有模板方法和基本方法。

  • Builder抽象建造类

产品的组建,一般由子类实现。

  • ConcreateBuilder具体建造者

实现抽象类的具体方法,并且返回一个组建好的对象。

  • Director导演类

设计产品的构建方式,告知builder开始构建。

以下是一段通用代码示例:

 

//产品类
public class Product{
    public void doSomething(){
    }
}
//抽象建造类
public abstract class Builder{
    //设置产品的不同部分,以获得不同的产品
    public abstract void setPart();
    //建造产品
    public abstract Product buildProduct();
}
//具体建造者
public class ConcreateProduct extends Builder{
    private Product product = new Product();
    //设置产品零件
    public void setPart(){
        /**产品类的逻辑处理*/
    }
    //组建一个产品
    public Product buildProduct(){
        return product;
    }
}
//导演类,可以起到封装作用,防止高层模块侵入到建造者内部的实现类中
public class Director{
    private Builder builder = new ConcreateProduct();
    //构建不同的产品
    public Product getAProduct(){
        builder.setPart();
        return builder.buildProduct();
    }
}

建造者模式优点:

  • 封装性,使客户端不必知道产品内部组成的细节。
  • 建造者独立,容易扩展。如果有多个ConcreateProduct是相互独立的,对系统扩展非常有利。
  • 便于控制细节风险,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他模块产生影响。

使用场景:

  • 相同的执行方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,可以使用该模式
  • 产品类非常复杂,或者产品类中的调用顺序产生不同的效能,适合使用该模式

扩展之链式编程:

建造者模式与工厂模式区别在于使用不同的顺序构造不同的对象,下面举一个例子(转载自博文https://blog.csdn.net/minwenping/article/details/78725911?utm_source=copy

),假设有四个角色:

1.用户client,提出造房子 Room的需求

2.设计者,Designer,出图纸,指挥包工头干,持有包工头

3.包工头, interface Build,拥有步骤和返回房子Room

4.Room,最终的产品

代码如下:

public class Room {
    //产品类,room,返回给client
    private String window;
    private String floor;

    /**
     * 真正的构建过程
     * @param roomParams
     * @return
     */
    public Room freshRoom(RoomParams roomParams) {
        this.window=roomParams.window;
        this.floor=roomParams.floor;
        return this;
    }

    @Override
    public String toString() {
        return "Room [window=" + window + ", floor=" + floor + "]";
    }
}
public class WorkerBuilder {
    //具体建造者 工人worker持有房子引用
    Room room=new Room();
    RoomParams roomParams=new RoomParams();

    public WorkerBuilder makeWindow(String windowStyle) {
        roomParams.setWindow(windowStyle);
        return this;
    }

    public WorkerBuilder makeFloor(String floorStyle) {
        roomParams.setFloor(floorStyle);
        return this;
    }

    public Room build() {
        // TODO Auto-generated method stub
        return room.freshRoom(roomParams);
    }

    class RoomParams{
        public String window;
        public void  setWindow(String window) {
            this.window = window;
        }
        public void setFloor(String floor) {
            this.floor = floor;
        }
        public String floor;
    }
}
public class Client {
    //client 客户提出需求,造房子,并得到房子
    //不关心过程和建造逻辑
    public static void main(String[] args) {
        //1.提供具体建造者,链式编程
        Room room=new WorkerBuilder().makeFloor("光滑地板").makeWindow("透明窗口").build();
        //4.建造完成,验收
        System.out.println("room建造完成:"+room.toString());
    }
}

 

 

以上是关于建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式(Builder)

设计模式之建造者模式

第十三章-建造者模式

设计模式 创建者模式 -- 建造者模式

设计模式从青铜到王者第八篇:创建型模式之建造者模式(BuilderPattern)

Java设计模式-建造者模式