设计模式之构造者模式

来源:互联网 发布:弗洛伊德算法 path 编辑:程序博客网 时间:2024/05/21 14:51

构造者模式是创建型模式之一,当构造的产品比较复杂,需要分为多个步骤或者流程完成产品的构建,可以选用构造模式。

构造者模式将具体的构造流程或者顺序隐藏,用户只需要调用对应的构造方法而不需要关心具体的构造细节问题。

构造者模式分为抽象构造者,具体构造者,构造导演类(申明产品构造的具体流程),产品类

代码如下:

抽象构造者:

package com.dean.dp.builder.dir;/** * 抽象构造者,定义构造对象的系列规范步骤 * @author bobei01 * */public interface IBuilder {/** * 构造墙 */public void builderWall();/** * 构造地板 */public void builderFloor();/** * 获取最终产品 * @return */public House getHouse();}

具体构造者:

package com.dean.dp.builder.dir;/** * 具体构造者 * @author bobei01 * */public class BuilderImpl implements IBuilder{private House house;public BuilderImpl() {super();this.house = new House();}@Overridepublic void builderWall() {house.setWall("太墙了");}@Overridepublic void builderFloor() {house.setFloor("超级无敌地板");}@Overridepublic House getHouse() {return house;}}

构造导演类:

package com.dean.dp.builder.dir;/** * 建造者模式的导演类,负责调用具体的建造者 * 引入具体的构造者,定义产品构造的流程顺序 * 将具体的构造过程隐藏,用户只需要使用不需要关系其内部构建细节 * @author bobei01 * */public class Director {private IBuilder builder;public Director(IBuilder builder) {super();this.builder = builder;}/** * 指导如何构建房屋,在这个方法中还可用加入其他逻辑,即在构造是验证等其他操作 */public void builderHouse(){builder.builderWall();builder.builderFloor();}}

产品类:

package com.dean.dp.builder.dir;/** * 具体要构造的产品 * @author bobei01 * */public class House {//房屋的墙private String wall;//房屋的地板private String floor;public String getWall() {return wall;}public void setWall(String wall) {this.wall = wall;}public String getFloor() {return floor;}public void setFloor(String floor) {this.floor = floor;}}

测试用例:

package com.dean.dp.builder.dir;public class Main {public static void main(String[] args) {IBuilder builder = new BuilderImpl();Director director = new Director(builder);//直接构造对象,不需要关心具体的细节director.builderHouse();House house = builder.getHouse();System.out.println(house.getFloor());}}

构造者模式另一种实现方式:上面方法中需要定义构造者接口,然后定义具体的构造者,通过导演类负责串联达到构造复杂对象。

在实际环境中,为了简化对象的创建,可以直接定义具体的构造者,不需要构造接口,与导演类。上面的方式通过接口定义构造产品,扩展比较灵活方便。

如果需要加入新的产品构造,只需要实现构造者接口,以及定义对应的构造者导演类即可。根据使用环境具体选择用什么方式。。。

代码

具体构造者:

package com.dean.dp.builder.sim;/** * 直接使用具体的构建类,不需要导演类 * @author bobei01 * */public class PeopleBuilder {private People people;public PeopleBuilder() {super();people = new People();}/** * 构建名称 * @param name * @return */public PeopleBuilder builderName(String name){people.setName(name);return this;}public PeopleBuilder builderNum(String num){people.setNum(num);return this;}public PeopleBuilder builderAge(int age){people.setAge(age);return this;}public People builder(){//返回构造的对象之前还可做一些其他操作,比如验证修饰等return people;}}

构造的产品:

package com.dean.dp.builder.sim;public class People {// 名字private String name;// 电话private String num;// 年龄private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

测试用例:

package com.dean.dp.builder.sim;public class Main {public static void main(String[] args) {People people = new PeopleBuilder().builderAge(27).builderName("Dean Yang").builderNum("425343").builder();System.out.println(people.getName());// Dean Yang}}


                                             
0 0