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


    本文源码: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、代码结构图

    二、建造者模式

    1、基础概念

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

    2、核心角色

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

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

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

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

    3)、导演者(Director)角色

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

    4)、产品(Product)角色

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

    3、模式图解

    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中应用

    分析

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

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

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

    2、Spring中应用

    源码实现

    // 系列方法
    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
    

  • 相关阅读:
    一个.java文件内只能写一个class吗
    Ubuntu下手动安装NextCloud
    基于 Ubuntu + nextCloud 搭建自己的私人网盘
    Ubuntu系统Apache 2部署SSL证书
    交叉验证与训练集、验证集、测试集
    [LeetCode] Restore IP Addresses
    [LeetCode] Decode Ways
    [LeetCode] Subsets II
    [LeetCode] Gray Code
    vector 的resize 和 reserve
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/11312555.html
Copyright © 2020-2023  润新知