低调大师

您现在的位置是:首页>文章详情

文章详情

Java描述设计模式(06):建造者模式

2019-09-01 5热度

本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

基于建造者模式,描述软件开发的流程。

1、代码实现

/** * 基于建造者模式描述软件开发 */ public class C01_InScene { public static void main(String[] args) { BuilderSoft builderSoft = new SoftImpl () ; ProjectManager manager = new ProjectManager(builderSoft) ; manager.createSoft(); } } /** * 手机软件产品开发 */ class MobileSoft { // 设计 private String design ; // 架构 private String frame ; // 开发 private String develop ; // 上线 private String online ; // 省略 GET SET 方法 } /** * 手机软件流程抽象类 */ abstract class BuilderSoft { // 前期工作 public abstract void earlyWork () ; // 中期工作 public abstract void midWork () ; // 后期工作 public abstract void lateWork () ; // 手机软件完成 public abstract MobileSoft builderSoft () ; } /** * 手机软件具体实现 */ class SoftImpl extends BuilderSoft { private MobileSoft mobileSoft = new MobileSoft(); @Override public void earlyWork() { System.out.println("软件前期设计..."); } @Override public void midWork() { System.out.println("软件中期架构..."); System.out.println("软件中期开发..."); } @Override public void lateWork() { System.out.println("软件后期上线..."); } @Override public MobileSoft builderSoft() { return mobileSoft ; } } /** * 项目经理:把控项目进度 */ class ProjectManager { private BuilderSoft builderSoft ; ProjectManager (BuilderSoft builderSoft){ this.builderSoft = builderSoft ; } // 统筹项目周期 public void createSoft (){ builderSoft.earlyWork(); builderSoft.midWork(); builderSoft.lateWork(); // MobileSoft mobileSoft = builderSoft.builderSoft() ; // return mobileSoft ; } }

2、代码结构图

06_1

二、建造者模式

1、基础概念

建造模式是对象的创建模式。建造模式可以将一个产品的内部属性描述与产品的生产过程分割,从而可以使一个建造过程生成具有不同的内部表象的产品对象。也就是使用一个中介对象封装一系列的对象交互,使其各个对象不需要显示的相互调用,而且可以单独的改变对象之间的交互。

2、核心角色

1)、抽象建造者(Builder)角色

给出一个抽象接口,以规范产品对象的各个组成成分的建造。模式中直接创建产品对象的是具体建造者角色。

2)、具体建造者(ConcreteBuilder)角色

完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出完成创建产品实例的操作。2.在建造完成后,提供产品的实例。

3)、导演者(Director)角色

担任这个角色的类调用具体建造者角色以创建产品对象。

4)、产品(Product)角色

产品便是建造的对象。一般来说,一个系统中会有多个产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

3、模式图解

06_2

4、源码实现

/** * 建造者模式代码 */ public class C02_Builder { public static void main(String[] args) { Builder builder = new ConcreteBuilder(); Director director = new Director(builder); director.construct(); Product product = builder.builderProduct(); System.out.println(product.getAct1()); System.out.println(product.getAct2()); } } /** * 产品类 */ class Product { /*定义一些产品的操作*/ private String act1; private String act2; public String getAct1() { return act1; } public void setAct1(String act1) { this.act1 = act1; } public String getAct2() { return act2; } public void setAct2(String act2) { this.act2 = act2; } } /** * Builder 抽象建造者类 */ abstract class Builder{ public abstract void builderact1(); public abstract void builderact2(); public abstract Product builderProduct(); } /** * 具体建造者类 */ class ConcreteBuilder extends Builder{ private Product product = new Product(); @Override public void builderact1() { product.setAct1("操作一:执行..."); } @Override public void builderact2() { product.setAct2("操作二:执行..."); } @Override public Product builderProduct() { return product; } } /** * Director 导演者类 */ class Director{ /*使用建造者抽象类*/ private Builder builder; Director(Builder builder){ this.builder = builder; } /*负责调用各个建造方法*/ public void construct(){ builder.builderact1(); builder.builderact2(); } }

三、实际应用

1、JDK中应用

06_4

分析

1)、Appendable定义多个append() 抽象方法,抽象建造者。

2)、AbstractStringBuilder实现Appendable接口,已经作为了建造者,只是抽象类无法实例化。

3)、StringBuilder继承AbstractStringBuilder,即作为具体建造者,也作为指挥者。

2、Spring中应用

06_3

源码实现

// 系列方法 public BeanDefinitionBuilder setParentName(String parentName); public BeanDefinitionBuilder setFactoryMethod(String factoryMethod); public BeanDefinitionBuilder setFactoryMethodOnBean(String factoryMethod, String factoryBean); public BeanDefinitionBuilder addConstructorArgValue(@Nullable Object value); public BeanDefinitionBuilder addConstructorArgReference(String beanName); public BeanDefinitionBuilder addPropertyValue(String name, @Nullable Object value); // 构建Bean public AbstractBeanDefinition getRawBeanDefinition() { return this.beanDefinition; } public AbstractBeanDefinition getBeanDefinition() { this.beanDefinition.validate(); return this.beanDefinition; }

上面两处建造者模式的实际应用,都有点形散而神不散的感觉。

四、优缺点分析

  • 优点:减少类之间的相互依赖,降低耦合度。
  • 缺点:ConcreateBuilder变得臃肿庞大,逻辑复杂。

五、源代码地址

GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent
收藏 (0)

相关文章

    文章评论

    共有0条评论来说两句吧...