思维盛宴之设计模式-构建者模式Builder Pattern

来源:互联网 发布:福顺达对讲机写频软件 编辑:程序博客网 时间:2024/04/18 22:29

    • 适用场景
    • 代码实现

1.适用场景

构建者模式,有时也叫生成器模式,顾名思义,是一种用来构建对象的设计模式。其最直接的行为就是分离出或抽象出(根据具体需要通过接口或抽象类的方式)对象的构建过程并且向外屏蔽内部的具体细节。这样做的好处是规范了构建对象的方式和外界所能提供的参数,而内部如何实现则是透明的,符合面向对象编程中“高内聚”的思想。

如果以上的说明仍然有些难以理解的话,我们来考虑如下的一个典型应用场景:

现在我们需要写一个程序,这个程序需要一些配置项参数用来做系统初始化,其中部分配置项是必须提供的,部分则可有可无。

通常,我们的做法是写一个配置类,将所有的配置项作为这个类的属性封装起来,然后写一些构造器,接收不同数目和相互组合的参数以生成不同的配置对象传递给程序其他部分来实现系统的初始化。这样做的一个弊端是,当配置项变多时,根据不同参数组合要编写的构造器的数目将会迅速的增加,导致对象的构造和程序的维护异常复杂和混乱。其根本原因在于对象的构造过程可能是很复杂的,而我们在调用方并不了解构造过程的前提下将构造对象的义务完全交给了ta。

那么,知道了以上弊端,解决方案就逐渐清晰了,我们需要把这个对象的构造过程分离出来,或者至少分离出一部分由我们自己掌控,而剩余的简单的不容易出错的部分则继续交给调用方。

到这里还是不够清晰的话,下面我们看一个具体的实例吧~

2.代码实现

以生产汽车这么一个过程举例,这里我就把问题简化一下,假设造一辆汽车最多就需要三样东西:引擎,轮子,颜色。(这个是玩具汽车吧亲。。好吧你要这么说我也承认。。^_^)

这三样东西里面,引擎和轮子总是必不可少的吧,不然真的不是汽车了o(╯□╰)o 至于颜色嘛,则是可有可无,你不说的话我就给你造个黄色的好了,大黄蜂,多酷炫~

public class Car {    private String engine;    private int wheels;    private String color;    private Car(){}     //不允许外界直接创建Car对象    public static class Builder {        private String engine;        private int wheels;        private String color;        //必须提供engine参数和wheels参数,规范Car对象构造过程        public Builder(String engine,int wheels){            this.engine = engine;            this.wheels = wheels;            this.color = "yellow";//默认颜色为黄色        }        //提供设置颜色的方法,如果不设置,也已经有默认的值了        public Builder setColor(String color){            this.color = color;            return this;        }        //只能通过内部类Builder的build()方法创建Car对象        //并且由于Builder没有静态方法,必须使用Builder对象        public Car build(){            Car car = new Car();            car.engine = this.engine;            car.wheels = this.wheels;            car.color = this.color;            return car;        }    }}

如注释中说明的,构建者模式说:“你不能自己创建对象,只能先按我要求构造一个统一的构建者,把必要的参数传给他,然后按需设置你自己的其他参数,其余的全部交给我了,对象会妥妥的返回给你”。

如何调用呢?请看下面的代码

public class BuilderPatternTest {    public static void main(String[] args){            Car car = new Car.Builder("v6",4).setColor("black").build();    }}

这里我让构造者(new Car.Builder(x,x))构造了一个v6引擎,4个轮子的汽车,并且我想要它是黑色的,然后调用了build方法便获得了我心爱的汽车,具体的构造过程我不想知道,也不需要知道。

如此,是不是将建造汽车必须提供引擎和轮子参数以及可选颜色这样两个过程给规范化了?并且屏蔽了内部的构造细节。

这便是构建者模式:“你不够专业,按我说的做,事情一定给你办的妥妥的”。


转载请注明

0 0
原创粉丝点击