Java设计模式学习笔记,三:建造者模式

建造者模式:实现了构建和装配的解耦,即对象的各个子组件单独构建,再进行装配,从而建造完整对象。

该模式适用于构建较为复杂的对象(多个子组件)。

不同的构建者,使用相同的装配者,可以建造不同的对象实例。相同的构建者,不同的装配顺序,也可能建造出不同的对象实例。

举例:

  汽车对象,子组件包括引擎、轮子和车体。

  Audi汽车构建者,负责制造Audi牌各个子组件。BMW汽车构建者,负责制造BMW牌各个子组件。然后将子组件统一送至汽车装配者的生产线中进行组装,最后会建造出Audi牌汽车和BMW汽车。

以下代码实现:

  首先,定义汽车类,及其子组件类。

  1 package com.corey.builder;
  2
  3 /**
  4  * 汽车类---产品类
  5  * @author Corey
  6  *
  7  */
  8 public class Car {
  9     private Engine engine;
 10     private Wheel wheel;
 11     private CarBody body;
 12
 13     public Engine getEngine() {
 14         return engine;
 15     }
 16     public void setEngine(Engine engine) {
 17         this.engine = engine;
 18     }
 19     public Wheel getWheel() {
 20         return wheel;
 21     }
 22     public void setWheel(Wheel wheel) {
 23         this.wheel = wheel;
 24     }
 25     public CarBody getBody() {
 26         return body;
 27     }
 28     public void setBody(CarBody body) {
 29         this.body = body;
 30     }
 31
 32     public void Run(){
 33         System.out.println("启动汽车,开始行程!");
 34     }
 35
 36
 37 }
 38
 39 /**
 40  * 发动机类
 41  * @author Corey
 42  *
 43  */
 44 class Engine {
 45     private String name;
 46
 47     public Engine(String name) {
 48         super();
 49         this.name = name;
 50     }
 51
 52     public String getName() {
 53         return name;
 54     }
 55
 56     public void setName(String name) {
 57         this.name = name;
 58     }
 59
 60 }
 61
 62 /**
 63  * 车轮类
 64  * @author Corey
 65  *
 66  */
 67 class Wheel {
 68     private String name;
 69
 70     public Wheel(String name) {
 71         super();
 72         this.name = name;
 73     }
 74
 75     public String getName() {
 76         return name;
 77     }
 78
 79     public void setName(String name) {
 80         this.name = name;
 81     }
 82
 83 }
 84
 85 /**
 86  * 车体类
 87  * @author Corey
 88  *
 89  */
 90 class CarBody {
 91     private String name;
 92
 93     public CarBody(String name) {
 94         super();
 95         this.name = name;
 96     }
 97
 98     public String getName() {
 99         return name;
100     }
101
102     public void setName(String name) {
103         this.name = name;
104     }
105
106 }

  然后,定义汽车制造者接口。

 1 package com.corey.builder;
 2
 3 /**
 4  * 汽车制造者接口
 5  * @author Corey
 6  *
 7  */
 8 public interface CarBuilder {
 9
10     String getBrand();
11     Engine buildEngine();
12     Wheel buildWheel();
13     CarBody buildCarBody();
14
15
16 }

  分别实现Audi汽车制造者类和BMW汽车制造者类。

 1 package com.corey.builder;
 2
 3 /**
 4  * 奥迪汽车建造者---接口实现类
 5  * @author Corey
 6  *
 7  */
 8 public class AudiCarBuidler implements CarBuilder{
 9
10
11
12     @Override
13     public Engine buildEngine() {
14         System.out.println("建造奥迪发动机!");
15         return new Engine("Audi发动机");
16     }
17
18     @Override
19     public Wheel buildWheel() {
20         System.out.println("建造奥迪车轮!");
21         return new Wheel("Audi车轮");
22     }
23
24     @Override
25     public CarBody buildCarBody() {
26         System.out.println("建造奥迪车体!");
27         return new CarBody("Audi车体");
28     }
29
30     @Override
31     public String getBrand() {
32         return "Audi";
33     }
34
35 }
 1 package com.corey.builder;
 2
 3 public class BMWCarBuilder implements CarBuilder{
 4
 5     @Override
 6     public String getBrand() {
 7         return "BMW";
 8     }
 9
10     @Override
11     public Engine buildEngine() {
12         System.out.println("建造宝马发动机!");
13         return new Engine("BMW发动机");
14     }
15
16     @Override
17     public Wheel buildWheel() {
18         System.out.println("建造宝马车轮!");
19         return new Wheel("BMW车轮");
20     }
21
22     @Override
23     public CarBody buildCarBody() {
24         System.out.println("建造宝马车体!");
25         return new CarBody("BMW车体");
26     }
27
28 }

  定义汽车装配者类。

package com.corey.builder;

/**
 * 奥迪汽车组装者--接口实现类
 * @author Corey
 *
 */
public class CarDirector{

    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
        super();
        this.builder = builder;
    }

    public Car directCar() {
        Car car = new Car();
        car.setEngine(builder.buildEngine());
        car.setWheel(builder.buildWheel());
        car.setBody(builder.buildCarBody());
        String brand = builder.getBrand();
        System.out.println("组装" + brand + "汽车完成!");
        return car;

    }

}

由此,我们可以进行汽车生产了。

指定汽车制造商,送入汽车装配厂,生产汽车,上路。以下是测试代码:

 1 package com.corey.builder;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6
 7         CarBuilder builder = new AudiCarBuidler();
 8         CarDirector director = new CarDirector(builder);
 9         Car car = director.directCar();
10         System.out.println(car.getEngine().getName());
11         car.Run();
12
13         System.out.println("----------------------------------");
14
15         CarBuilder builder1 = new BMWCarBuilder();
16         CarDirector director1 = new CarDirector(builder1);
17         Car bmwCar = director1.directCar();
18         System.out.println(bmwCar.getEngine().getName());
19         bmwCar.Run();
20     }
21 }

运行结果:

建造奥迪发动机!
建造奥迪车轮!
建造奥迪车体!
组装Audi汽车完成!
Audi发动机
启动汽车,开始行程!
----------------------------------
建造宝马发动机!
建造宝马车轮!
建造宝马车体!
组装BMW汽车完成!
BMW发动机
启动汽车,开始行程!

至此,建造者模式完成。

Java框架中很多都是用建造者模式写的,一般都会以Builder结尾,常见的如StringBuilder。

时间: 2024-12-11 15:54:53

Java设计模式学习笔记,三:建造者模式的相关文章

Java 设计模式学习笔记1——策略模式(Duck例子)

0.假设现有工程(Duck)中遇到为类添加功能的问题,如何设计类添加新的功能? 1.利用继承提供的Duck(鸭子)的行为会导致哪些缺点? (1)代码在多个子类中重复 (2)很多男知道所有鸭子的全部行为 (3)运行时的行为不容易改变 (4)改变会牵一发动全身,造成其他鸭子的不想要的改变 [设计原则] 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需呀变化的代码混在一起 2.分开变化与不会变化的部分 将Duck分成两部分,鸭子类和鸭子行为. 类的固有属性和共用的方法写在类中,行为另起一个类

设计模式学习笔记--备忘录(Mamento)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--迭代(Iterator)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--访问者(Visitor)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

Java多线程学习笔记--生产消费者模式

实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前水平只能膜拜,本次只能算学习笔记,为了巩固自己对Java多线程常规知识点的理解,路过大神还望能指导指导.下面一段代码是最常规的生产者消费者的例子: package com.zhanglei.demo; import java.util.ArrayList; import java.util.List

设计模式学习笔记--工厂方法模式

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展.所以就有了下面的工厂方法模式: 工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类. // 设计模式Dem

java设计模式(五)--建造者模式(Builder)

转载:http://zz563143188.iteye.com/blog/1847029 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的.我们看一下代码: 还和前面一样,一个Sender接口,两个实现类MailSender和SmsSender.最后,建造者类如下: /** * 建造者模式 * Created by mrf on 2016/2/

菜鸟学设计模式系列笔记之建造者模式(Builder模式)

提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化. 从而保持系统中的"稳定构建算法"不随需求变化而变化.----建造者模式 建造模式是对象的创建模式 建造模式可以将一个产品的内部表象与产品的生成过程分割开来, 从而可以是一个建造过程生成具有不同的内部表象的产品对象. Intent : 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 Motivation: 在复杂对象的构造过程中,允许同样的构造过程能够加入新的被