其他分享
首页 > 其他分享> > 23种设计模式之建造者模式

23种设计模式之建造者模式

作者:互联网

23种设计模式之建造者模式

文章目录

参考资料

下文如有错漏之处,敬请指正

一、简介

定义

建造者模式是将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。

特点

通用类图

在这里插入图片描述
在建造者模式中,有如下5个角色:

优点

● 封装性

使用建造者模式可以使客户端不必知道产品内部组成的细节。

● 建造者独立,容易扩展

XConcreteBuilder和YConcreteBuilder是相互独立的,当需要新的(同样构造过程)产品时,只需要添加一个新的ConcreteBuilder。

● 便于控制细节风险

由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

应用场景

二、建造者模式

需求:

客户端需要一台奔驰C级轿车和一台奔驰S级轿车,指挥者了解了基本信息后,向建造者下达生产命令,由具体建造者实施命令,最终返回相应的产品。

Product:产品,定义奔驰汽车的基本信息。Benz(奔驰汽车)

Component:组件,奔驰起床建造需要的零件。BenzEngine(奔驰引擎) BenzTire(奔驰轮胎)BenzSteeringWheel(奔驰方向盘)BenzFrame(奔驰汽车框架)

Builder:抽象建造者,定义奔驰汽车建造的过程。BenzBuilder(奔驰起床抽象建造者)

ConcreteBuilder:具体建造者,实现当前奔驰级别汽车的生产。BenzCarCBuilder(奔驰C级汽车建造者)BenzCarSBuilder(奔驰S级汽车建造者)

Director:指挥者,根据客户端的要求指挥生产相应的产品。BenzDirector(奔驰汽车指挥者)

Client:向指挥者传递产品的基本信息获取产品。

Product:

package builder;

public class Benz {
    private BenzEngine benzEngine;
    private BenzTire benzTire;
    private BenzSteeringWheel benzSteeringWheel;
    private BenzFrame benzFrame;

    public BenzEngine getBenzEngine() {
        return benzEngine;
    }

    public void setBenzEngine(BenzEngine benzEngine) {
        this.benzEngine = benzEngine;
    }

    public BenzTire getBenzTire() {
        return benzTire;
    }

    public void setBenzTire(BenzTire benzTire) {
        this.benzTire = benzTire;
    }

    public BenzSteeringWheel getBenzSteeringWheel() {
        return benzSteeringWheel;
    }

    public void setBenzSteeringWheel(BenzSteeringWheel benzSteeringWheel) {
        this.benzSteeringWheel = benzSteeringWheel;
    }

    public BenzFrame getBenzFrame() {
        return benzFrame;
    }

    public void setBenzFrame(BenzFrame benzFrame) {
        this.benzFrame = benzFrame;
    }
}

Component:

package builder;

public  class BenzEngine {
    public String name;

    public BenzEngine(String name) {
        this.name = name;
    }
}
package builder;

public class BenzFrame {
    public String name;

    public BenzFrame(String name) {
        this.name = name;
    }
}
package builder;

public  class BenzSteeringWheel {
    public String name;

    public BenzSteeringWheel(String name) {
        this.name = name;
    }
}
package builder;

public class BenzTire {
    public String name;

    public BenzTire(String name) {
        this.name = name;
    }
}

Builder:

package builder;

public interface BenzBuilder {
    public void buildBenzTire();
    public void buildBenzSteeringWheel();
    public void buildBenzEngine();
    public void buildBenzFrame();
    public Benz build();
}

ConcreteBuilder:

package builder;

public class BenzCarCBuilder implements BenzBuilder  {
    Benz benzCar=new Benz();
    @Override
    public void buildBenzTire() {
       benzCar.setBenzTire(new BenzTire("奔驰C级汽车轮胎"));
        System.out.println("正在生产奔驰C级汽车轮胎");
    }

    @Override
    public void buildBenzSteeringWheel() {
        benzCar.setBenzSteeringWheel(new BenzSteeringWheel("奔驰C级汽车方向盘"));
        System.out.println("正在生产奔驰C级汽车方向盘");

    }

    @Override
    public void buildBenzEngine() {
        benzCar.setBenzEngine(new BenzEngine("奔驰C级汽车引擎"));
        System.out.println("正在生产奔驰C级汽车引擎");

    }

    @Override
    public void buildBenzFrame() {
        benzCar.setBenzFrame(new BenzFrame("奔驰C级汽车框架"));
        System.out.println("正在生产奔驰C级汽车框架");

    }

    @Override
    public Benz build() {
        return benzCar;
    }
}
package builder;

public class BenzCarSBuilder implements BenzBuilder  {
    Benz benzCar=new Benz();
    @Override
    public void buildBenzTire() {
        benzCar.setBenzTire(new BenzTire("奔驰S级汽车轮胎"));
        System.out.println("正在生产奔驰S级汽车轮胎");
    }

    @Override
    public void buildBenzSteeringWheel() {
        benzCar.setBenzSteeringWheel(new BenzSteeringWheel("奔驰S级汽车方向盘"));
        System.out.println("正在生产奔驰S级汽车方向盘");

    }

    @Override
    public void buildBenzEngine() {
        benzCar.setBenzEngine(new BenzEngine("奔驰S级汽车引擎"));
        System.out.println("正在生产奔驰S级汽车引擎");

    }

    @Override
    public void buildBenzFrame() {
        benzCar.setBenzFrame(new BenzFrame("奔驰S级汽车框架"));
        System.out.println("正在生产奔驰S级汽车框架");

    }

    @Override
    public Benz build() {
        return benzCar;
    }
}

Director:

package builder;

public class BenzDirector {
    private BenzBuilder  builder = null;

    public BenzDirector(BenzBuilder  builder) {
        this.builder = builder;
    }

    // 指挥者可以根据需求调整构建步骤(顺序)
    public Benz construct() {
        builder.buildBenzEngine();
        builder.buildBenzFrame();
        builder.buildBenzTire();
        builder.buildBenzSteeringWheel();
        return builder.build();
    }
}

Client:

package builder;

public class Client {

    public static void main(String[] args) {
        //模拟用户跟指挥者说了要奔驰C级汽车,然后传入C级汽车的建造者
        Benz benzC = new BenzDirector(new BenzCarCBuilder()).construct();
        System.out.println("=======================");
        //模拟用户跟指挥者说了要奔驰S级汽车,然后传入S级汽车的建造者
        Benz benzS = new BenzDirector(new BenzCarSBuilder()).construct();

     /**
		 *   输出结果:
		 *   正在生产奔驰C级汽车引擎
		 *   正在生产奔驰C级汽车框架
		 *   正在生产奔驰C级汽车轮胎
		 *   正在生产奔驰C级汽车方向盘
		 *   =======================
		 *   正在生产奔驰S级汽车引擎
		 *   正在生产奔驰S级汽车框架
		 *   正在生产奔驰S级汽车轮胎
		 *   正在生产奔驰S级汽车方向盘
		 */
    }


}

三、 建造者模式与抽象工厂模式的区别

四、总结

标签:name,23,builder,建造,奔驰,void,设计模式,public
来源: https://blog.csdn.net/space_qi/article/details/113083043