当前位置: 首页 > news >正文

设计模式之建造者模式

    什么是建造者模式,GOF给出的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这句话其实表达的意思就是把构建对象这个复杂的过程和组成这个对象的部件解耦,使得相同的转配方式可以装配出不同的产品。

    下面是建造者模式的类图:

    下面我们用构建汽车的例子来介绍一下什么是建造者模式:

    1.首先我们先创建一个汽车的产品对象:

public class Car {
    private String tires;   //轮胎
    private String engine;  //引擎
    private String steeringWheel;  //方向盘
    public String getTires() {
        return tires;
    }
    public void setTires(String tires) {
        this.tires = tires;
    }
    public String getEngine() {
        return engine;
    }
    public void setEngine(String engine) {
        this.engine = engine;
    }
    public String getSteeringWheel() {
        return steeringWheel;
    }
    public void setSteeringWheel(String steeringWheel) {
        this.steeringWheel = steeringWheel;
    }
    
}

    2.创建一个抽象的汽车建造类

public abstract class CarBuilder {
    public Car car= new Car();
    
    public abstract void buildTires();
    public abstract void buildEngine();
    public abstract void buildSteeringWheel();
    
    public Car buildCar(){
        return this.car;
    }
    
}

3.创建一个具体的汽车建造类(专门建造跑车)

public class SprotCarBuilder extends CarBuilder{

    @Override
    public void buildTires() {
        this.car.setTires("跑车的轮胎");
        
    }

    @Override
    public void buildEngine() {
        this.car.setEngine("跑车的引擎");
        
    }

    @Override
    public void buildSteeringWheel() {
       this.car.setSteeringWheel("跑车的方向盘");
        
    }

}

4.创建一个指挥者类(调用建造类创建产品)

public class CarDirector {
    
    private CarBuilder carBuilder;
    
    public CarDirector(CarBuilder carBuilder){
        this.carBuilder = carBuilder;
    }
    
    public Car construct(){
        this.carBuilder.buildEngine();
        this.carBuilder.buildSteeringWheel();
        this.carBuilder.buildTires();
        return this.carBuilder.buildCar();
    }
    
}

5.客户端调用代码:

public class Custom {
      public static void main(String[] args) {
          CarBuilder carBuilder = new SprotCarBuilder();
          CarDirector director = new CarDirector(carBuilder);
          Car car = director.construct();
          System.out.println(car.getEngine());
          System.out.println(car.getSteeringWheel());
          System.out.println(car.getTires());
    }
}

使用建造者模式对于用户而言只需要知道创建具体产品的建造者即可,对于如何创建对象用户是不关心的。当需要创建其他的产品对象时只需要创建对应的建造类即可,符合设计模式中的开闭原则,但是如果每一个产品类都使用建造者模式会出现大量的建造者类,程序将变得难以维护,所以如果我们所需要的产品类并没有想象的那么复杂建议就没有必要使用建造者模式。

转载于:https://www.cnblogs.com/suyang-java/p/10337543.html

相关文章:

  • 苹果Q1财报出炉:手机收入下滑15%,服务收入增长19%
  • 2018年全国姓名报告发布:新生儿起名用这50个字最多
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 男子半年两次癫痫病发 救他的居然是同一个民警
  • 腾讯广点通这三年
  • 一个精简的React+Ant Design后台管理系统模版
  • Go 子测试使用说明
  • BZOJ3236:[AHOI2013]作业(莫队,分块)
  • HTML5新特性总结
  • 数据结构学习之队列
  • prometheus jmx exporter原理
  • Python 3 字符串转MD5形式
  • Vue常见指令
  • 寒假作业三——抓老鼠啊~亏了还是赚了?
  • [译]前端离线指南(上)
  • nodejs:开发并发布一个nodejs包
  • Redux系列x:源码分析
  • Spring核心 Bean的高级装配
  • uni-app项目数字滚动
  • Vue ES6 Jade Scss Webpack Gulp
  • 百度地图API标注+时间轴组件
  • 简单数学运算程序(不定期更新)
  • 坑!为什么View.startAnimation不起作用?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​520就是要宠粉,你的心头书我买单
  • #define、const、typedef的差别
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (+4)2.2UML建模图
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (一)WLAN定义和基本架构转
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)为C# Windows服务添加安装程序
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ... 是什么 ?... 有什么用处?
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core 6 集成和使用 mongodb
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • /dev下添加设备节点的方法步骤(通过device_create)
  • ?php echo ?,?php echo Hello world!;?
  • [2016.7 day.5] T2
  • [Angular 基础] - 数据绑定(databinding)
  • [BUUCTF 2018]Online Tool
  • [C++]高精度 bign (重载运算符版本)
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [CSS]文字旁边的竖线以及布局知识
  • [FZSZOJ 1223] 上海红茶馆