建造者模式

Posted wx5add7776993de

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建造者模式相关的知识,希望对你有一定的参考价值。


文章目录

一,建造者模式

1.什么是建造者模式

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

2.建造者模式几大角色

抽象模型和具体实现模型

抽象模型就是你要建造的对象的抽象形式,比如,我现在要建造一辆车,但是车有很多种型号,那么,这些不同型号的车就是具体实现模型,车就是抽象模型

/**
* @Description: 抽象模型
* @Author: Kevin
* @CreateDate: 2019/6/17 0:44
* @UpdateUser: Kevin
* @UpdateDate: 2019/6/17 0:44
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
public abstract class AbstractModel

//执行顺序
private ArrayList<String> sequence = new ArrayList<String>();

protected abstract void start();

protected abstract void alarm();

protected abstract void engineBoom();

protected abstract void stop();

public void run()

//根据执行顺序执行方法,组合成run方法
for(int i=0;i<this.sequence.size();i++)
String actionName = this.sequence.get(i);
if(actionName.equalsIgnoreCase("start"))
this.start();
//启动汽车
else if(actionName.equalsIgnoreCase("stop"))
this.stop();
//停止汽车
else if(actionName.equalsIgnoreCase("alarm"))
this.alarm();
//喇叭开始叫了
else if(actionName.equalsIgnoreCase("engineBoom"))
//如果是engine boom关键
this.engineBoom();
//引擎开始轰鸣




public void setSequence(ArrayList<String> sequence)
this.sequence = sequence;

具体实现模型:

/**
* @Description: 模型具体实现 --- A模型
* @Author: Kevin
* @CreateDate: 2019/6/17 0:47
* @UpdateUser: Kevin
* @UpdateDate: 2019/6/17 0:47
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
public class ModelA extends AbstractModel

@Override
protected void start()
System.out.println("---------> A 启动");


@Override
protected void alarm()
System.out.println("---------> A 鸣笛");


@Override
protected void engineBoom()
System.out.println("---------> A 引擎声");


@Override
protected void stop()
System.out.println("---------> A 停止");

/**
* @Description: 模型具体实现 --- B模型
* @Author: Kevin
* @CreateDate: 2019/6/17 0:47
* @UpdateUser: Kevin
* @UpdateDate: 2019/6/17 0:47
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
public class ModelB extends AbstractModel

@Override
protected void start()
System.out.println("---------> B 启动");


@Override
protected void alarm()
System.out.println("---------> B 鸣笛");


@Override
protected void engineBoom()
System.out.println("---------> B 引擎声响起");


@Override
protected void stop()
System.out.println("---------> B 停止");

抽象和具体建造者

抽象建造者:定义建造这辆车的抽象方法

/**
* @Description: 抽象模型建造者
* @Author: Kevin
* @CreateDate: 2019/6/17 0:58
* @UpdateUser: Kevin
* @UpdateDate: 2019/6/17 0:58
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
public abstract class AbstractModelBuilder

public abstract AbstractModel getModel();

public abstract void setList(ArrayList<String> list);

具体建造者,具体建造某一型号的车的建造者

/**
* @Description: 模型A建造者
* @Author: Kevin
* @CreateDate: 2019/6/17 1:05
* @UpdateUser: Kevin
* @UpdateDate: 2019/6/17 1:05
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
public class ModelABuilder extends AbstractModelBuilder

private ModelA modelA = new ModelA();

@Override
public AbstractModel getModel()
return modelA;


@Override
public void setList(ArrayList<String> list)
modelA.setSequence(list);

/**
* @Description: 模型B建造者
* @Author: Kevin
* @CreateDate: 2019/6/17 1:05
* @UpdateUser: Kevin
* @UpdateDate: 2019/6/17 1:05
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
public class ModelBBuilder extends AbstractModelBuilder

private ModelB modelB = new ModelB();

@Override
public AbstractModel getModel()
return modelB;


@Override
public void setList(ArrayList<String> list)
modelB.setSequence(list);

导演

导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。在建造者模式比较庞大时,导演类可以有多个

/**
* @Description: 导演类
* @Author: Kevin
* @CreateDate: 2019/6/17 1:07
* @UpdateUser: Kevin
* @UpdateDate: 2019/6/17 1:07
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
public class Director

private ModelABuilder modelABuilder = new ModelABuilder();
private ModelBBuilder modelBBuilder = new ModelBBuilder();
private ArrayList<String> list = new ArrayList<>();

public ModelA getModelA1()
//clear的动作,以防止数据混乱
list.clear();
list.add("start");
list.add("alarm");
list.add("engineBoom");
list.add("stop");
modelABuilder.setList(list);
return (ModelA) modelABuilder.getModel();


public ModelA getModelA2()
list.clear();
list.add("start");
list.add("engineBoom");
list.add("alarm");
list.add("stop");
modelABuilder.setList(list);
return (ModelA) modelABuilder.getModel();


public ModelA getModelA3()
list.clear();
list.add("alarm");
list.add("start");
list.add("engineBoom");
list.add("stop");
modelABuilder.setList(list);
return (ModelA) modelABuilder.getModel();


//同理还可以封装更多......

3.建造者模式应用场景

1. 何时使用

一个基本部件不会变,而其组合经常变化的时候

2. 优点

  • 封装性。是客户端不必知道产品内部组成的细节。
  • 建造者独立,易扩展。
  • 便于控制细节风险。可以对建造过程逐步细化,而不对其他模块产生任何影响。

3. 缺点

  • 产品必须有共同点,范围有限制。
  • 如果内部变化复杂,会有很多建造类。

4. 使用场景

相同的方法,不同的执行顺序,产生不同的事件结果时。
需要生成的对象具有复杂的内部结构时。
多个部件或零件,都可以装配到一个对象中,但产生的结果又不相同时。

5. 与工厂模式的区别

建造者模式更关注于零件装配的顺序,建造者模式一般和模板方法模式一起配合使用


以上是关于建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式—设计角度重温DNF中的角色

设计模式总结篇系列:建造者模式(Builder)

建造者模式和模板方法模式扩展篇

一天一个设计模式 - 建造者模式(Builder)

建造者模式(Builder Pattern)

建造者模式(Builder Pattern)