设计模式之四:建造者模式

本文介绍了建造者模式,将复杂对象的表示和构建过程分开,使同样的表示过程可创建不同表示。给出建造者模式UML图,以构建学校为例进行案例实现,包括建造者抽象类、产品类、实现类、管家类和具体调用类,体现了该模式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

1.1 定义
  首先介绍下什么是建造者模式.通过网络查询,得知:将一个复杂对象的表示和构建过程分开,使得同样的表示过程可以创建不同的表示
  下面介绍下我个人对它的的理解.分别进行介绍.
  将一个复杂对象的表示:通过面向对象的编程方式,让我们知道任何对象都可以用一个类虚拟表示.比如一个人,一关管家,一个国家,一个地球.或者别的更为复杂的对象,我们都可以通过写一个类来对其进行表示.
  构建过程分开:作为对比介绍下什么叫构建构成不分开. 我们已经有了一个类,我们打算构建一个这样的对象.以前,我们知道,构建一个类需要对象提供构造函数,需要构建的时候我们new 对象,调用其构造函数并赋予初值,那么,返回的对象就是我们希望得到的对象实例.那么我们可以说.这个过程,这个对象的表示和构建是没有分开的.那么构建过程分开,是指:当我new这个对象的时候(这个new的过程仅仅是获取一个对象的表示,它还没有被赋值, 还不算一个完整的对象),不给其赋初值,把构建过程给"别的类"来做的.而这个过程,我们可以说表示和构建过程是分开的.
  使得同样的表示过程可以创建不同的表示:在"构建过程分开"中我们说了,在建造者模式中,我们会把类的表示和构建过程分开,在"别的类"对该类进行构建.那么,在这个过程中,这个别的类是可以定制化的,通过创建不同的"别的类",来达到创建不同的类的的表示.


2.框架

         aaa

                                                                                              建造者模式UML 图

注意: 图中Director 和Builder 是聚合关系. 这里也印证了设计模式中,编程依赖于抽象的原则.
 

3.案例实现

这个通过通过建造者模式构建一个学校.学校里面有老师,学生,教学楼,后勤服务,等等.


1. 建造者的抽象类

抽象类的目的是提供构建方法的声明

package com.example.designmode;
abstract class Builder {
    public abstract void buildTeacher();
    public abstract void buildStudent();
    public abstract void buildBuilding();
    public abstract void buildRearServices();
    public abstract Object getObject();
}

2. 产品类

产品类的标示,也是我们最终需要的类:

package com.example.designmode;
import java.util.ArrayList;
import java.util.List;

public class School {
    private List<String> mList = new ArrayList<String>();
    public void add(String str){
        mList.add(str);
    }
    public List<String> getList(){
        return mList;
    }
}

3. 建造者的实现类

基于抽象类的实现.主要是实现了抽象类的接口:

package com.example.designmode;

public class ConcreteBuilder extends Builder {

    public School mSchool = new School();
    @Override
    public void buildRearServices() {
        mSchool.add("Rear services");
    }

    @Override
    public void buildBuilding() {
        mSchool.add("Buildings");
    }

    @Override
    public void buildStudent() {
        mSchool.add("Students");
    }

    @Override
    public void buildTeacher() {
        mSchool.add("Two teachers");
    }

    @Override
    public School getObject() {
        return mSchool;
    }
}
}

4. 建造者的管家类

这个类非常重要:它是建造者模式的核心,它通过类的方法,构建出一个产品.用户可以直接调用它,从而获得一个产品

package com.example.designmode;

public class Director {
    public Object createSchool(Builder builder){
        builder.buildBuilding();
        builder.buildRearServices();
        builder.buildStudent();
        builder.buildTeacher();
        return builder.getObject();
    }
}

5. 具体调用类

使用管家类,获得一个产品.
在这里我们可以看出:仅仅看这个地方,我们是不知道构建的过程的.

package com.example.designmode;
import java.util.Iterator;

public class myClass {
    public static void main(String[] args){
        ConcreteBuilder mConcreateBuilder = new ConcreteBuilder();
        Director mDirector = new Director();
        School mSchool = (School)mDirector.createSchool(mConcreateBuilder);
        if (mSchool != null) {
            Iterator mIterator = mSchool.getList().iterator();
            while (mIterator.hasNext()) {
                System.out.println(" School has :"+mIterator.next());
            }
        }
    }
}

输出:

  School has :Buildings
    School has :Rear services
    School has :Students
    School has :Two teachers
    Process finished with exit code 0
内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值