建造者模式

应用场景

  • 需要构建一个复杂的对象,同时它里面的许多构建细节对于不同情况要有不同的操作,这时就可以使用建造者模式。也就是这个复杂的对象内部的构建顺序其实是稳定的,但是其内部的具体的构建细节是复杂多变的。

  • 使用了建造者模式,用户创建的时候只要指定需要的类型,就可以自动创建好了,用户不需要知道里面的创建细节。

Builder是为了创建一个Product对象的各个部件而指定的接口,ConcreteBuilder是具体的建造者,实现Builder接口构建具体的产品组件,

  • Product
package 结构;

import java.util.ArrayList;
import java.util.List;

/**
 * @Program: 设计模式
 * @Description: 产品类,有多个组件完成
 * @Author Mokairui
 * @Date 2020/12/27 22:18
 */
public class Product {

    List<String> parts = new ArrayList<>();

    // 添加产品部件
    public void add(String part) {
        parts.add(part);
    }

    // 创建产品的过程
    public void show() {
        System.out.println("产品创建-------");
        parts.forEach(System.out::println);
    }

}

  • Builder

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 建造者类,确定产品又两个部件PartA和PartB完成,并声明一个得到产品的方法GetResult
     * @Author Mokairui
     * @Date 2020/12/27 22:22
     */
    public interface Builder {
    
        void buildPartA();
        void buildPartB();
        Product getResult();
    
    }
    
    
  • ConcreteBuilderA

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description:
     * @Author Mokairui
     * @Date 2020/12/28 20:37
     */
    public class ConcreteBuilderA implements Builder {
    
        private Product product = new Product();
    
        @Override
        public void buildPartA() {
            product.add("部件 A");
        }
    
        @Override
        public void buildPartB() {
            product.add("部分 B");
        }
    
        @Override
        public Product getResult() {
            return product;
        }
    }
    
    
  • ConcreteBuilderB

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description:
     * @Author Mokairui
     * @Date 2020/12/28 20:37
     */
    public class ConcreteBuilderB implements Builder {
    
        private Product product = new Product();
    
        @Override
        public void buildPartA() {
            product.add("部件 X");
        }
    
        @Override
        public void buildPartB() {
            product.add("部分 Y");
        }
    
        @Override
        public Product getResult() {
            return product;
        }
    }
    
    
  • Director

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 指挥者类
     * @Author Mokairui
     * @Date 2020/12/27 22:28
     */
    public class Director {
    
        public void construct(Builder builder) {
            builder.buildPartA();
            builder.buildPartB();
        }
    
    }
    
    
  • Demo

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description:
     * @Author Mokairui
     * @Date 2020/12/28 20:41
     */
    public class Demo {
    
        public static void main(String[] args) {
    
            Director director = new Director();
            Builder b1 = new ConcreteBuilderA();
            Builder b2 = new ConcreteBuilderB();
    
            director.construct(b1);
            Product p1 = b1.getResult();
            p1.show();
    
            director.construct(b2);
            Product p2 = b2.getResult();
            p2.show();
    
        }
    
    }
    
    

posted on 2020-12-28 21:30  莫铠瑞  阅读(31)  评论(0)    收藏  举报