建造者模式
一,什么是建造者模式
定义:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是23种设计模式中创建型模式中的一种,我们知道创建模式有五种,分别是单例模式、工厂方法模式、抽象工厂模式、原型模式及建造者模式,这些模式无一例外都是用于创建某个类的对象实例。
什么场景可以用建造者模式:当一个类的构造过多时并且个别参数可选填,这时可以考虑使用用建造者模式。
目的:是为了分离对象的属性与创建过程。
二,代码实现
实现建造者模式有两种方式:传统方式实现、静态内部类方式
废话不多说了直接上代码吧,代码更直观,下面一步一步来定义一个建造者模式。
下面例子以创建一个人为例,默认普通人,人有身体、耳朵、眼睛、牙齿等待。
1,Build传统方式实现:
下面案例中我把构建得过程交给客户端不在单独实现,
第一步,首先创建我们的目标对象,
packagepattern.build;/*** 产品
*@authorningbeibei*/
public classProduct {private String body="普通身体";private String ear = "普通耳朵";private String eye = "普通眼睛";private String mouth = "普通牙齿";publicString getBody() {returnbody;
}public voidsetBody(String body) {this.body =body;
}publicString getEar() {returnear;
}public voidsetEar(String ear) {this.ear =ear;
}publicString getEye() {returneye;
}public voidsetEye(String eye) {this.eye =eye;
}publicString getMouth() {returnmouth;
}public voidsetMouth(String mouth) {this.mouth =mouth;
}
}
第二步,定义建造者抽象类
packagepattern.build;/*** 建造者抽象类
*@authorningbeibei*/
public abstract classAbstractBuilder {abstract AbstractBuilder body(String msg);//身体
abstract AbstractBuilder mouth(String msg);//嘴巴
abstract AbstractBuilder ear(String msg);//耳朵
abstract AbstractBuilder eye(String msg);//眼睛
abstract Product getProduct();//获取产品
}
第三步,建造者类具体实现继承自 AbstractBuilder 抽象类并实现抽象方法,注意:具体建造者类中构造函数用来创建目标对象,
packagepattern.build;/*** 具体建造者
*@authorningbeibei*/
public class Build extendsAbstractBuilder{//声明产品属性
privateProduct product;//具体建造者构造函数用来创建产品对象
publicBuild() {
product= newProduct();
}
@Override
AbstractBuilder body(String msg) {
product.setBody(msg);return this;
}
@Override
AbstractBuilder mouth(String msg) {
product.setMouth(msg);return this;
}
@Override
AbstractBuilder ear(String msg) {
product.setEar(msg);return this;
}
@Override
AbstractBuilder eye(String msg) {
product.setEye(msg);return this;
}
@Override
Product getProduct() {returnproduct;
}
}
第四步,测试类,我这没有写指挥者类,这个指挥者我交给客户端来做,建造者模式一般在构造复杂对象时可以考虑使用,根据不同得场景使用不同得设计模,但是在真正使用时基本上不会单独使用一种设计模,大多数都是混合使用,这就需要阅读代码者需要对设计模式足够了解和掌握。
packagepattern.build;/*** 建造者模式测试类
*@authorningbeibei*/
public classTest {public static voidmain(String[] args) {//创建构建对象
Build build1 = newBuild();//这里可以用方法链来组建对象
Product p = build1.body("金身").ear("顺风耳").getProduct();
System.out.println(p.getBody()+" "+p.getEar()+" "+p.getEye()+" "+p.getMouth());
}
}
2,静态内部类方式实现:
a.首先创建一个 StaticBuild 类并定义属性封装get方法,我代码中定义属性用 final 修饰的,所以不需要set方法,把初始化属性放到静态内部类中;
b.在 StaticBuild 类中创建静态内部类 Builder (静态内部类)类;
c.创建 StaticBuild类构造方法并用 private 修饰,参数为 Builder (静态内部类)类型;
d.在 Builder 中定义属性,可以把 StaticBuild类属性复制到 Builder类中(静态内部类属性去除 final 修饰符);
e.在 Builder 中创建设置函数,对 StaticBuild中那些参数进行赋值,返回值为 Builder类型的实例;
g.在 Builder中创建一个 build()方法,在其中构建 StaticBuild的实例并返回;
请看完成代码:
packagepattern.build;/*** 静态内部类实现建造者模式
*@authorningbeibei*/
public classStaticBuild {private finalString name;private finalString age;private finalString shengao;private finalString toufa;//构造函数
privateStaticBuild(Builder build){this.name =build.name;this.age =build.age;this.shengao =build.shengao;this.toufa =build.toufa;
}//静态内部类
public static classBuilder{privateString name;privateString age;privateString shengao;privateString toufa;//构造函数
publicBuilder(String name,String age) {this.name =name;this.age =age;
}//设置属性值,返回Builder对象
publicBuilder setShengao(String shengao) {this.shengao =shengao;return this;
}//设置属性值,返回Builder对象
publicBuilder setToufa(String toufa) {this.toufa =toufa;return this;
}//构建StaticBuild对象并返回
publicStaticBuild build(){return new StaticBuild(this);
}
}publicString getName() {returnname;
}publicString getAge() {returnage;
}publicString getShengao() {returnshengao;
}publicString getToufa() {returntoufa;
}
}
测试类
packagepattern.build;/*** 建造者模式测试类
*@authorningbeibei*/
public classTest {public static voidmain(String[] args) {//静态内部类式建造者模式
StaticBuild build = new StaticBuild.Builder("张三", "30").setShengao("178").setToufa("红").build();
System.out.println("姓名:"+build.getName());
System.out.println("年龄:"+build.getAge());
System.out.println("身高:"+build.getShengao());
System.out.println("头发:"+build.getToufa());
}
}
三,写的不足之处请批评指正