Java设计模式之建造者模式

什么是建造者模式?
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
作用:
把复杂对象的构建过程和细节封装起来,用户只需指定需要建造的类型就可以得到它们,方便复用对象。

UML原理图:

在这里插入图片描述

实例:
/**
 * 产品类
 */
public class Product {

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

    public void Add(String part){
        parts.add(part);
    }

    public void show(){
        System.out.println("产品创建");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
/**
 * 建造者抽象类
 */
public abstract class Builder {
    public abstract void BuildPartA();
    public abstract void BuildPartB();
    public abstract Product GetResult();
}
/**
 * 具体建造者类
 */
public class ConcreteBuild1 extends 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;
    }
}
/**
 * 具体建造者
 */
public class ConcreteBuild2 extends 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;
    }
}
/**
 * 指挥者
 */
public class Director {

    public void Construct(Builder builder){
        builder.BuildPartA();
        builder.BuildPartB();
    }
}
public static void main(String[] args){
        Director director=new Director();
        Builder b1=new ConcreteBuild1();
        Builder b2=new ConcreteBuild2();

        director.Construct(b1);
        Product product1=b1.GetResult();
        product1.show();

        director.Construct(b2);
        Product product2=b2.GetResult();
        product2.show();
    }

去掉指挥者使用静态内部类实现建造者,链式调用方式配置参数,构建产品对象。

public class Course {
    private String courseName;
    private String coursePPT;
    private String courseVideo;
    private String courseArticle;
    private String courseQA;

    public Course(CourseBuilder builder){
        this.courseName=builder.courseName;
        this.coursePPT=builder.coursePPT;
        this.courseVideo=builder.courseVideo;
        this.courseArticle=builder.courseArticle;
        this.courseQA=builder.courseQA;
    }

    @Override
    public String toString() {
        return "Course{" +
                "courseName='" + courseName + '\'' +
                ", coursePPT='" + coursePPT + '\'' +
                ", courseVideo='" + courseVideo + '\'' +
                ", courseArticle='" + courseArticle + '\'' +
                ", courseQA='" + courseQA + '\'' +
                '}';
    }

    public static class CourseBuilder{
        private String courseName;
        private String coursePPT;
        private String courseVideo;
        private String courseArticle;
        private String courseQA;

        public CourseBuilder buildCourseName(String courseName){
            this.courseName=courseName;
            return this;
        }

        public CourseBuilder buildCoursePPT(String coursePPT){
            this.coursePPT=coursePPT;
            return this;
        }

        public CourseBuilder buildCourseVideo(String courseVideo){
            this.courseVideo=courseVideo;
            return this;
        }

        public CourseBuilder buildCourseArticle(String courseArticle){
            this.courseArticle=courseArticle;
            return this;
        }

        public CourseBuilder buildCourseQA(String courseQA){
            this.courseQA=courseQA;
            return this;
        }

        public Course build(){
            return new Course(this);
        }
    }
}
public static void main(String[] args){
        Course course=new Course.CourseBuilder().buildCourseName("设计模式")
                .buildCourseArticle("设计模式手记")
                .buildCoursePPT("PPT精讲")
                .buildCourseVideo("java设计模式视频")
                .buildCourseQA("问答")
                .build();
        System.out.println(course);
    }
1. 内容概要 本项目是一个支持科学函数的命令行计算器,兼容 C++98 标准。它实现了中缀表达式词法分析、后缀表达式转换求值,支持常见数学运算(如幂、三角函数、对数等)括号优先级解析。程序还提供了角度版三角函数、角度弧度互转功能,并支持函数调试输出函数演示模式。 2. 适用人群 * C++ 初中级学习者,特别是希望深入理解表达式求值机制者 * 需要一个可扩展的计算引擎的项目开发者 * 想通过项目实践词法分析、调度场算法、数学函数封装的开发者 * 高校学生课程设计、编译原理实践者 3. 使用场景及目标 * 实现中缀表达式的完整求解器,支持函数嵌套、优先级结合性处理 * 提供角度弧度版本的三角函数,以适应不同输入偏好 * 演示中缀转后缀过程,辅助编程教育算法教学 * 提供科学函数辅助计算,如 `log`, `sqrt`, `abs`, `exp`, `ceil`, `floor` 等 4. 其他说明 * 支持函数:sin, cos, tan(弧度);sind, cosd, tand(角度) * 支持函数嵌套,如 `sin(deg2rad(30))` * 支持操作符:+, -, \*, /, ^, \*\*(幂运算)括号优先级 * 所有函数均通过 map 注册,方便扩展自定义 * 输入 `help` 查看支持函数,`demo` 观看转后缀过程,`quit` 退出程序 * 提示用户避免使用 `°` 符号,推荐使用角度函数代替 * 可通过 `g++ calculator.cpp -o calculator -lm` 编译(需链接数学库)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值