您的位置:首页 > 编程语言 > Java开发

九、建造者模式——设计模式学习笔记

2017-07-01 19:51 344 查看
作为一个编程菜鸟,过去在学习设计模式的时候,老师给推荐了一本《大话设计模式》。阅读以后受益匪浅,可惜当初没有坚持看完。
最近有时间了,又重新捡起来学习了一遍,整理了一下笔记,由于本人能力有限,欢迎大家批评指正。


1.建造者模式 Builder Pattern

建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

通过建造者模式,用户只需指定需要建造的类型就可以得到它们,而具体建造的过程细节就不需要知道了。

2.应用场景

当构造过程必须允许被构造的对象有不同表示时。

当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

这些对象内部构建间的建造顺序通常是稳定的,但对象的构建通常面临着复杂的变化。

3.优点

使建造代码与表示分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

4.uml类图



5.组成

(1)Builder

为创建一个产品对象的各个部件指定抽象接口。

(2)ConcreteBuilder

实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

(3)Director

构造一个使用Builder接口的对象。

(4)Product

表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

6.实例

(1)机器人产品类

package com.longinus.bp;
import java.util.*;
public class Robot {
private List<String> robot = new ArrayList<>();

public void add(String compoent){
robot.add(compoent);
}

public void show(){
System.out.print("机器人崭新出厂:");
for(String str : robot){
System.out.print(str + " ");
}
System.out.println();
}
}


(2)机器人建造抽象类

package com.longinus.bp;
public abstract class RobotBuilder {
public abstract void buildHead();
public abstract void buildBody();
public abstract void buildFoot();
public abstract Robot buildRobot();
}


(3)具体机器人建造类A

package com.longinus.bp;
public class ConcreteRobotBuilderA extends RobotBuilder{
private Robot robot = new Robot();

@Override
public void buildHead() {
// TODO Auto-generated method stub
robot.add("头部零件A");
}
@Override
public void buildBody() {
// TODO Auto-generated method stub
robot.add("身体零件A");
}
@Override
public void buildFoot() {
// TODO Auto-generated method stub
robot.add("腿部零件A");
}
@Override
public Robot buildRobot() {
// TODO Auto-generated method stub
return robot;
}
}


(4)具体机器人建造类B

package com.longinus.bp;
public class ConcreteRobotBuilderB extends RobotBuilder{

private Robot robot = new Robot();

@Override
public void buildHead() {
// TODO Auto-generated method stub
robot.add("头部零件B");
}
@Override
public void buildBody() {
// TODO Auto-generated method stub
robot.add("身体零件B");
}
@Override
public void buildFoot() {
// TODO Auto-generated method stub
robot.add("腿部零件B");
}
@Override
public Robot buildRobot() {
// TODO Auto-generated method stub
return robot;
}
}


(5)指挥类

package com.longinus.bp;
public class Director {
public void construct(RobotBuilder builder){
builder.buildHead();
builder.buildBody();
builder.buildFoot();
}
}


(6)测试类

package com.longinus.bp;
public class Test {
public static void main(String[] args) {
Robot robot;
Director director = new Director();

ConcreteRobotBuilderA rba = new ConcreteRobotBuilderA();
ConcreteRobotBuilderB rbb = new ConcreteRobotBuilderB();

director.construct(rba);
robot = rba.buildRobot();
robot.show();

director.construct(rbb);
robot = rbb.buildRobot();
robot.show();
}
}


(7)输出结果

机器人崭新出厂:头部零件A 身体零件A 腿部零件A
机器人崭新出厂:头部零件B 身体零件B 腿部零件B
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息