java建造者模式静态内部类,java设计模式-建造者模式

建造者模式

一,什么是建造者模式

定义:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是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());

}

}

三,写的不足之处请批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值