云服务器安装Hbase

news2024/11/16 19:52:48

文章目录

    • 1. HBase安装部署
    • 2.HBase服务的启动
    • 3.HBase部署高可用(可选)
    • 4. HBase整合Phoenix
      • 4.1 安装Phoenix
      • 4.2 **Phoenix Shell** 操作
      • 4.3 表的映射
      • 4.4 Phoenix二级索引
        • 4.4.1 全局索引(global index)
        • 4.4.2 包含索引(covered index)
        • 4.4.3 本地索引(local index)
      • 5. HBase和Hive集成

1. HBase安装部署

  • 集群配置

    s1s2s3s4gracal
    HBaseHMaster HRegionServerHRegionServerHMaster(备用) HRegionServerHRegionServerHRegionServer
  • 保证Zookeeper以及Hadoop处于部署并且正常启动的状态

    #脚本启动hadoop
    myhadoop.sh start
    #脚本启动Zookeeper
    zk.sh start
    
  • 解压HBase安装包到/opt/module目录

  • 配置环境变量并分发

    [gaochuchu@s1 module]$ sudo vim /etc/profile.d/my_env.sh
    #HBASE_HOME
    export HBASE_HOME=/opt/module/hbase-2.4.11
    export PATH=$PATH:$HBASE_HOME/bin
    
  • 修改配置文件hbase-env.sh

    [gaochuchu@s1 conf]$ cd /opt/module/hbase-2.4.11/conf
    [gaochuchu@s1 conf]$ vim hbase-env.sh 
    export HBASE_MANAGES_ZK=false
    

    其最后添加:export HBASE_MANAGES_ZK=false;关闭由HBase管理自身的Zookeeper实例

  • 修改base-site.xml内容:

    [gaochuchu@s1 conf]$ vim hbase-site.xml 
    <property>
     <name>hbase.zookeeper.quorum</name>
     <value>s1,s2,s3,s4,gracal</value>
     <description>The directory shared by RegionServers.
     </description>
     </property>
    <!-- <property>-->
    <!-- <name>hbase.zookeeper.property.dataDir</name>-->
    <!-- <value>/export/zookeeper</value>-->
    <!-- <description> 记得修改 ZK 的配置文件 -->
    <!-- ZK 的信息不能保存到临时文件夹-->
    <!-- </description>-->
    <!-- </property>-->
     <property>
     <name>hbase.rootdir</name>
     <value>hdfs://s1:8020/hbase</value>
     <description>The directory shared by RegionServers.
     </description>
     </property>
     <property>
     <name>hbase.cluster.distributed</name>
     <value>true</value>
     </property>
    
  • 配置RegionServers

    [gaochuchu@s1 conf]$ vim regionservers
    s1
    s2
    s3
    s4
    gracal
    
  • 解决HBase和Hadoop的log4j兼容性问题,修改HBase的jar包,使用Hadoop的jar包

    [gaochuchu@s1 conf]$ mv /opt/module/hbase-2.4.11/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar /opt/module/hbase-2.4.11/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar.bak
    
  • 分发HBase

2.HBase服务的启动

  • 单点启动和停止

    [gaochuchu@s1 hbase-2.4.11]$ bin/hbase-daemon.sh start master
    [gaochuchu@s1 hbase-2.4.11]$ bin/hbase-daemon.sh start regionserver
    
  • 群启和停止(推荐)

    [gaochuchu@s1 hbase-2.4.11]$ bin/start-hbase.sh 
    [gaochuchu@s1 hbase-2.4.11]$ bin/stop-hbase.sh 
    
  • 查看HBase的Web页面

    启动成功后,通过访问http://s1:16010查看HBase的管理页面

    image-20231030160115140

3.HBase部署高可用(可选)

  • 在 HBase 中 HMaster 负责监控 HRegionServer 的生命周期,均衡 RegionServer 的负载,如果 HMaster 挂掉了,那么整个 HBase 集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以 HBase 支持对 HMaster 的高可用配置。

    #conf目录下创建backup-masters文件
    [gaochuchu@s1 hbase-2.4.11]$ touch conf/backup-masters
    #在backup-masters文件配置高可用节点
    [gaochuchu@s1 hbase-2.4.11]$ vim  conf/backup-masters
    s3
    #将conf目录分发
    [gaochuchu@s1 conf]$ xsync backup-masters 
    
  • 此时重新启动HBase,访问http://s1:16010,可以看到多了备用master节点

    image-20231030160906363

4. HBase整合Phoenix

  • Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表,插入数据和查询 HBase 数据
  • 为什么使用Phoenix
    • 官方给的解释为:在 Client 和 HBase 之间放一个 Phoenix 中间层不会减慢速度,因为用户编写的数据处理代码和 Phoenix 编写的没有区别,不仅如此Phoenix 对于用户输入的 SQL 同样会有大量的优化手段(就像 hive 自带 sql 优化器一样)。
    • 其能将用户编写的SQL语句改写为HBase的API

4.1 安装Phoenix

  • 安装Phoenix

    #上传并解压Phoenix安装包到/opt/module
    [gaochuchu@s1 softs]$ tar -zxvf phoenix-hbase-2.4-5.1.2-bin.tar.gz  -C /opt/module/
    #改名为phoenix
    [gaochuchu@s1 module]$ mvphoenix-hbase-2.4-5.1.2-bin/ phoenix
    #复制phoenix的server包并且拷贝到各个节点中
    [gaochuchu@s1 phoenix]$ cp phoenix-server-hbase-2.4-5.1.2.jar /opt/module/hbase-2.4.11/lib/
    [gaochuchu@s1 phoenix]$ xsync /opt/module/hbase-2.4.11/lib/phoenix-server-hbase-2.4-5.1.2.jar
    #配置环境变量
    [gaochuchu@s1 module]$ sudo vim /etc/profile.d/my_env.sh 
    #phoenix
    export PHOENIX_HOME=/opt/module/phoenix
    export PHOENIX_CLASSPATH=$PHOENIX_HOME
    export PATH=$PATH:$PHOENIX_HOME/bin
    [gaochuchu@s1 module]$ source /etc/profile
    #重启HBase
    [gaochuchu@s1 module]$ stop-hbase.sh 
    [gaochuchu@s1 module]$ start-hbase.sh 
    
  • 连接Phoenix

    [gaochuchu@s1 phoenix]$  bin/sqlline.py s1,s2,s3,s4,gracal:2181
    

    image-20231030171754509

4.2 Phoenix Shell 操作

  • 显示表

    0: jdbc:phoenix:s1,s2,s3,s4,gracal:2181> !table
    0: jdbc:phoenix:s1,s2,s3,s4,gracal:2181> !tables
    
  • 创建表:直接指定单个列作为RowKey,相当于sql中的主键

    CREATE TABLE IF NOT EXISTS student(
    id VARCHAR primary key,
    name VARCHAR,
    age BIGINT,
    addr VARCHAR);
    

    在 phoenix 中,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。

    执行上述语句,查看表,发现表名为大写

    image-20231030172211769

  • 创建表:直接指定多个列的联合为RowKey

    CREATE TABLE IF NOT EXISTS student1 (
    id VARCHAR NOT NULL,
    name VARCHAR NOT NULL,
    age BIGINT,
    addr VARCHAR
    CONSTRAINT my_pk PRIMARY KEY (id, name));
    
    • 注:Phoenix 中建表,会在 HBase 中创建一张对应的表。为了减少数据对磁盘空间的占用,Phoenix 默认会对 HBase 中的列名做编码处理。具体规则可参考官网链接:https://phoenix.apache.org/columnencoding.html,若不想对列名编码,可在建表语句末尾加上 COLUMN_ENCODED_BYTES = 0;

    • 可以看到,这里的列名没有显示对应的string,而是做了编码处理

      image-20231030173055379

  • 插入数据

    upsert into student values('1001','gcc', 23, 'changsha');
    
  • 查询记录

    select * from student;
    select * from student where id='1001';
    
  • 删除记录

    delete from student where id='1001';
    
  • 删除表

    drop table student;
    
  • 退出命令行

    !quit
    

4.3 表的映射

  • 表的关系

    默认情况下, HBase 中已存在的表,通过 Phoenix 是不可见的。如果要在 Phoenix 中操作 HBase 中已存在的表,可以在 Phoenix 中进行表的映射。映射方式有两种:视图映射和表映射

    • 在HBase的shell命令行创建test表格

      RowKeyinfo1info2
      IdnameAddress
       create 'test','info1','info2'
       put 'test','1001','info1:name','gcc'
       put 'test','1001','info1:address','changsha'
      
    • 视图映射

      Phoenix 创建的视图是只读的,所以只能用来做查询,无法通过视图对数据进行修改等操作,即删除视图对原数据无影响。在 phoenix 中创建关联 test 表的视图

      #创建视图
      create view "test"(
        id varchar primary key,
        "info1"."name" varchar, 
        "info2"."address" varchar);
      #查看视图,小写的表名需要加双引号
      select * from "test";
      #删除视图,小写的表名需要加双引号
      drop view "test";  
      
    • 表映射

      在 Pheonix 创建表去映射 HBase 中已经存在的表,是可以修改删除 HBase 中已经存在的数据的。而且,删除 Phoenix 中的表,那么 HBase 中被映射的表也会被删除。

      特别注意:进行表映射时,不能使用列名编码,需将 column_encoded_bytes 设为 0。因为编码会导致Pheonix的表无法和HBase映射

      create table"test"(
        id varchar primary key,
        "info1"."name" varchar, 
        "info2"."address" varchar)column_encoded_bytes=0;
      
    • 关于数字类型说明

      HBase 中的数字,底层存储为补码,而 Phoenix 中的数字,底层存储为在补码的基础上,将符号位反转。故当在 Phoenix 中建表去映射 HBase 中已存在的表,当 HBase 中有数字类型的字段时,会出现解析错误的现象。

      常见的解决方案:

      • Phoenix 种提供了 unsigned_int,unsigned_long 等无符号类型,其对数字的编码解码方式和 HBase 是相同的,如果无需考虑负数,那在 Phoenix 中建表时采用无符号类型是最合适的选择。
      • 如需考虑负数的情况,则可通过 Phoenix 自定义函数,将数字类型的最高位,即符号位反转即可,自定义函数可参考如下链接:https://phoenix.apache.org/udf.html

4.4 Phoenix二级索引

  • HBase是没有二级索引的概念的,利用Phoenix中间层,可以为其建立二级索引

  • 需要添加如下配置到HBase的HRegionServer节点的hbase-site.xml

    [gaochuchu@s1 hbase-2.4.11]$ vim conf/hbase-site.xml
    <!-- phoenix regionserver 配置参数-->
    <property>
     <name>hbase.regionserver.wal.codec</name>
    <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
    </property>
    [gaochuchu@s1 hbase-2.4.11]$ xsync conf/hbase-site.xml 
    #Hbase重启
    [gaochuchu@s1 hbase-2.4.11]$ stop-hbase.sh
    [gaochuchu@s1 hbase-2.4.11]$ start-hbase.sh
    
4.4.1 全局索引(global index)
  • Global Index 是默认的索引格式,创建全局索引时,会在 HBase 中建立一张新表。也就是说索引数据和数据表是存放在不同的表中的,因此全局索引适用于多读少写的业务场景。写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗

  • 在读数据的时候 Phoenix 会选择索引表来降低查询消耗的时间。

  • 创建单个字段的全局索引

    CREATE INDEX my_index ON my_table (my_col);
    
    • 举例

      create index my_index on student1(age);
      

      image-20231030193820634

    • 此时创建了MY_INDEX的单独的索引表,保存相关的索引信息

  • 查看二级索引是否有效:执行explainPlan计划,有二级索引会变为范围扫描

    explain select id,name from student1 where age = 10;
    

    image-20231030194343904

    注意:如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。

    explain select id,name,addr from student1 where age = 10;

    因为id,name是主键构成的联合索引,age是全局索引,addr不是索引,因此这时候查询是全表扫描

  • 删除索引

    DROP INDEX my_index ON my_table
    
    • 举例

      drop index my_index on student1;
      
4.4.2 包含索引(covered index)
  • 创建携带其他字段的全局索引(本质还是全局索引)。

    CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);
    
    • 举例

      create index my_index on student1(age) include (addr);
      
    • 此时我们仍运行4.4.1中原本走全表扫描的例子

      explain select id,name,addr from student1 where age = 10;
      

      image-20231030194925713

      此时走了范围查询,因为age为全局索引,其携带了addr字段

4.4.3 本地索引(local index)
  • Local Index 适用于写操作频繁的场景。索引数据和数据表的数据是存放在同一张表中(且是同一个 Region),避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。

    CREATE LOCAL INDEX my_index ON my_table (my_column);
    #其中my_column可以是多个,类似于组合索引
    

    本地索引会将所有的信息存在一个影子列族中,虽然读取的时候也是范围扫描,但是没有全局索引快,优点在于不用写多个表了。

    • 举例

      0: jdbc:phoenix:s1,s2,s3,s4,gracal:2181> drop index my_index on student1;
      CREATE LOCAL INDEX my_index ON student1 (age,addr);
      
    • 此时我们执行执行计划

      explain select id,name,addr from student1 where age = 10;
      

      image-20231030195428321

5. HBase和Hive集成

  • 如果大量的数据已经存放在 HBase 上面,需要对已经存在的数据进行数据分析处理,那么 Phoenix 并不适合做特别复杂的 SQL 处理,此时可以使用 hive 映射 HBase 的表格,之后写 HQL 进行分析处理。

  • 在hive-site.xml中添加zookeeper的属性:

    [gaochuchu@s1 conf]$ vim hive-site.xml 
    <property>
     <name>hive.zookeeper.quorum</name>
     <value>s1,s2,s4,s4,gracal</value>
    </property>
    <property>
     <name>hive.zookeeper.client.port</name>
     <value>2181</value>
    </property>
    #启动Hive客户端
    [gaochuchu@s1 hive-3.1.2]$ hive
    
  • 实例1

    • 目标:建立Hive表,关联HBase表,插入数据到Hive表的同时能够影响HBase表。

    • 在Hive中创建表同时关联HBase

      CREATE TABLE hive_hbase_emp_table(
       empno int,
       ename string,
       job string,
       mgr int,
       hiredate string,
       sal double,
       comm double,
       deptno int
      )STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
      WITH SERDEPROPERTIES ("hbase.columns.mapping" = 
      ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
      TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
      

      此时在Hive中出现这个表:

      image-20231030200342694

      同时在Hbase中也出现了这个表:

      image-20231030200532203

    • 在Hive中创建临时中间表,用于load文件中的数据

      注意不能将数据直接load进Hive所关联HBase的那张表中,因为创建的Hive表格和HBase关联,结构比较复杂

      CREATE TABLE emp(
       empno int,
       ename string,
       job string,
       mgr int,
       hiredate string,
       sal double,
       comm double,
       deptno int
      )
      row format delimited fields terminated by '\t';
      
    • 向Hive临时表中load 数据

      hive> load data local inpath '/opt/softs/emp.txt' into table emp;
      
    • 通过insert命令将中间表中的数据导入Hive关联的Hbase的那张表中

      hive> insert into table hive_hbase_emp_table select * from emp;
      
    • 查看Hive以及相关联的HBase表中是否已经成功同步插入了数据

      hive> select * from hive_hbase_emp_table;
      

      image-20231030201320207

      Hbase> scan 'hbase_emp_table'
      

      image-20231030201410913

  • 实例2

    目标:在 HBase 中已经存储了某一张表 hbase_emp_table,然后在 Hive 中创建一个外部表来关联 HBase 中的 hbase_emp_table 这张表,使之可以借助 Hive 来分析 HBase 这张表中的数据。

    • Hive中创建外部表

      CREATE EXTERNAL TABLE relevance_hbase_emp(
       empno int,
       ename string,
       job string,
       mgr int,
       hiredate string,
       sal double,
       comm double,
       deptno int
      )STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
      WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno") 
      TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
      
    • 关联后就可以使用Hive函数进行一些分析操作如

      hive (default)> select deptno,avg(sal) monery from relevance_hbase_emp group by deptno ;
      

      image-20231030201951394

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1150996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SEW MOVIPRO应用模块AMA0801

应用模块AMA0801特点 1)、点动模式2)、试教模式3)、寻参模式4)、定位模式5)、同步模式 其他额外的功能(只要通过端子控制时有效) 1)、平滑过渡功能2)、位置开关功能3)、自动调整功能4)、位置修正功能 基本模式&#xff1a; 点动模式 点动控制电机正、反转运行。 如果…

udp协议/tcp协议

udp和tcp作为传输层的两大重要协议&#xff0c;是众多学习网络编程者不可错过的学习内容&#xff0c;协议的概念想必不用再过多解释&#xff0c;即程序员和程序员之间进行网络通讯时的标准&#xff0c;那么经历了应用层&#xff0c;也就是肉眼能看到、用户能直接操作的层&#…

Spring Cloud之ElasticSearch的学习【详细】

目录 ElasticSearch 正向索引与倒排索引 数据库与elasticsearch概念对比 安装ES、Kibana与分词器 分词器作用 自定义字典 拓展词库 禁用词库 索引库操作 Mapping属性 创建索引库 查询索引库 删除索引库 修改索引库 文档操作 新增文档 查找文档 修改文档 全量…

安卓平板-学习平板、三防工业平板安卓主板方案

近年来&#xff0c; 生活和工业产品的需求呈爆发式增长&#xff0c;学习平板、工业平板和智能设备的出货量正处于快速增长的阶段。尤其是安卓平板智能设备&#xff0c;其增长势头依然迅猛。根据预测&#xff0c;到2024年&#xff0c;中国平板设备的总出货量将会进一步增长。 安…

顺序表(1)

目录 线性表 顺序表Sequential List 静态顺序表 动态顺序表 主函数Test.c test1 test2 test3 test4 头文件&函数声明SeqList.h 头文件 函数声明 函数实现SeqList.c 初始化SLInit 释放销毁SLDestroy 扩容SLCheckCapacity 打印SLPrint 尾插SLPushBack …

“智能科技·链接未来”2024中国国际人工智能产品展览会·智博会

2024年中国国际人工智能产品展览会&#xff08;简称世亚智博会&#xff09;将于3月份在上海举办&#xff0c;6月份在北京举办。本届展会以“智能科技链接未来”为主题&#xff0c;将集中展示全球前沿的人工智能技术和应用&#xff0c;以及人工智能在各个领域的新成果。 本届展会…

Unity 粒子特效-第二集-烟雾特效

一、烟雾特效预览 二、制作原理 资源在绑定资源里&#xff0c;我得审核通过以后才能改成免费&#xff0c;如果着急要&#xff0c;可以评论区发一下&#xff0c;我给你们发网盘 1.这个是序列帧图片粒子特效一起组合而成的 这就是一个单独整个的烟雾动画 如下&#xff0c;是这…

Google Play上的Android广告软件应用程序积累了200万次安装

大家好&#xff0c;今天我们要聊一聊Google Play上的一个热门话题——Android广告软件应用程序。最近&#xff0c;一些恶意应用程序在Google Play上累积了200万次的安装量&#xff0c;给用户推送了讨厌的广告&#xff0c;同时又隐藏了它们在受感染设备上的存在。 根据Doctor W…

保护生产中 Node.js 应用程序安全的 15 项最佳实践

在后端开发方面&#xff0c;Node.js 是开发人员最喜欢的技术之一。它的受欢迎程度不断上升&#xff0c;现已成为在线攻击的主要目标之一。这就是为什么保护 Node.js 免受漏洞和威胁至关重要。 在本指南中&#xff0c;您将看到为生产设计安全 Node.js 应用程序架构的 15 种最佳…

安防视频监控平台EasyCVR前端解码与后端解码的区别介绍

视频监控平台/视频存储/视频分析平台EasyCVR基于云边端一体化管理&#xff0c;支持多类型设备、多协议方式接入&#xff0c;具体包括&#xff1a;国标GB28181协议、RTMP、RTSP/Onvif、海康Ehome&#xff0c;以及海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石SDK等&#x…

linux中etc目录中常用文件

1.查看当前系统版本信息情况 cat /etc/redhat-release 版本是7.5 2.查看当前系统用户基本信息文件 cat /etc/passwd 3.查看当前系统主机名配置文件 cat /etc/hostname 可以更改主机名 方法一&#xff1a;临时修改方法&#xff0c;退出后重新连接即可生效 语…

云服务器安装Hive

文章目录 1. 安装Hive(最小化部署)2. MySQL安装3. Hive元数据配置到MySQL4. HiveServer2服务5. Metastore服务运行模式6. 编写脚本来管理hive的metastore/hiveserver2服务的启动和停止1.7 Hive常用命令 7. Hive参数配置方式7.1 Hive常见的几个属性配置 安装Hive的前提是先安装H…

通信原理板块——卷积码(原理、代数和几何表示、编码和解码)

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、卷积码定义 卷积码(convolution…

Python--快速入门一

Python--快速入门一 1.创建Python的项目 使用IDE&#xff1a;PyCharm 创建项目文件夹&#xff1a; 点击新建项目 将位置地址改为想要Python项目存放的位置 基础解释器选择最新版本的解释器&#xff08;此处为Python3.120 关闭创建main.py(此功能是自动一个初始文件&#x…

[量化投资-学习笔记004]Python+TDengine从零开始搭建量化分析平台-EMA均线

在之前的文章中用 Python 直接计算的 MA 均线&#xff0c;但面对 EMA 我认怂了。 PythonTDengine从零开始搭建量化分析平台-MA均线的多种实现方式 高数是我们在大学唯一挂过的科。这次直接使用 Pandas 库的 DataFrame.ewm 函数&#xff0c;便捷又省事。 并且用 Pandas 直接对之…

【ElasticSearch系列-02】ElasticSearch的概念和基本操作

ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631 深入理解ElasticSearch概念和基本操…

建筑模板-优质建筑模板厂家推荐

随着建筑行业的不断发展&#xff0c;优质的建筑模板成为了保障工程施工质量的重要一环。在众多建筑模板厂家中&#xff0c;广西贵港市能强优品木业凭借其优质的产品和良好的口碑赢得了业界的认可与信赖。 广西贵港市能强优品木业是一家专注于建筑模板生产的企业&#xff0c;公司…

#stm32整理(二)关于MDK的编译过程及文件类型全解

参考野火开发指南如有侵权即刻删除&#xff0c;只是为了学习交流使用 1、编译 1、编译过程简介 (1&#xff09;编译&#xff0c;MDK 软件使用的编译器是 armcc 和 armasm&#xff0c;它们根据每个 c/c 和汇编源文件编译 成对应的以“.o”为后缀名的对象文件 (Object Code&…

设计模式—创建型模式之工厂模式

设计模式—创建型模式之工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;提供了一种创建对象的最佳方式。我们不必关心对象的创建细节&#xff0c;只需要根据不同情况获取不同产品即可。 简单工厂模式 比如我们有造车的工厂&#xff0c;来生产车&#xff0c;我们先…