`
yollywu
  • 浏览: 17742 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Builder模式与Configuration

阅读更多
摘自:http://www.jdon.com/designpatterns/builder.htm
Builder模式定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.

Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到.

为何使用?
是为了将构建复杂对象的过程和它的部件解耦.注意: 是解耦过程和部件.

因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开.

如何使用?
首先假设一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示.

首先,需要一个接口,它定义如何创建复杂对象的各个部件:

public interface Builder {

  //创建部件A  比如创建汽车车轮
  void buildPartA();
  //创建部件B 比如创建汽车方向盘
  void buildPartB();
  //创建部件C 比如创建汽车发动机
  void buildPartC();

  //返回最后组装成品结果 (返回最后装配好的汽车)
  //成品的组装过程不在这里进行,而是转移到下面的Director类中进行.
  //从而实现了解耦过程和部件
  Product getResult();

}


用Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),也就是说Director的内容是如何将部件最后组装成成品:

public class Director {

  private Builder builder;

  public Director( Builder builder ) {
    this.builder = builder;
  }
  // 将部件partA partB partC最后组成复杂对象
  //这里是将车轮 方向盘和发动机组装成汽车的过程
  public void construct() {
    builder.buildPartA();
    builder.buildPartB();
    builder.buildPartC();

  }

}

Builder的具体实现ConcreteBuilder:
通过具体完成接口Builder来构建或装配产品的部件;
定义并明确它所要创建的是什么具体东西;
提供一个可以重新获取产品的接口:

public class ConcreteBuilder implements Builder {

  Part partA, partB, partC;
  public void buildPartA() {
    //这里是具体如何构建partA的代码

  };
  public void buildPartB() {
    //这里是具体如何构建partB的代码
  };
   public void buildPartC() {
    //这里是具体如何构建partB的代码
  };
   public Product getResult() {
    //返回最后组装成品结果
  };

}

复杂对象:产品Product:
public interface Product { }

复杂对象的部件:
public interface Part { }


我们看看如何调用Builder模式:
ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director( builder );

director.construct();
Product product = builder.getResult();


Builder模式的应用
在Java实际使用中,我们经常用到"池"(Pool)的概念,当资源提供者无法提供足够的资源,并且这些资源需要被很多用户反复共享时,就需要使用池.

"池"实际是一段内存,当池中有一些复杂的资源的"断肢"(比如数据库的连接池,也许有时一个连接会中断),如果循环再利用这些"断肢",将提高内存使用效率,提高池的性能.修改Builder模式中Director类使之能诊断"断肢"断在哪个部件上,再修复这个部件.

在sf.cft.configuration中
使用Hibernate的第一个步骤是要对其进行配置:
Configuration cfg = new Configuration()
    .addFile("Vertex.hbm.xml")
    .addFile("Edge.hbm.xml");

net.sf.hibernate.cfg.Configuration的一个实例代表了应用程序中所有的Java类到关系数据库的映射的集合
在Configuration中,有大量的addXXX方法,这些方法共同的目的是把映射信息加到映射集合中,其最核心的方法是:
protected void add(org.dom4j.Document doc)

在添加完映射的集合之后,紧接着就是生成SessionFactory。
//返回一个Session工厂实现类对象。
public SessionFactory buildSessionFactory() throws HibernateException {
secondPassCompile();
validate();
Environment.verifyProperties(properties);
Properties copy = new Properties();
copy.putAll(properties);
Settings settings = buildSettings();
configureCaches(settings);
return new SessionFactoryImpl(this, settings);
}

Configuration使用了Builder模式,主要完成SessionFactory的构建与生成。
分享到:
评论

相关推荐

    C++ builder 工程选项

    - **_TCHAR Maps To**: _TCHAR 是一个预处理器宏,它在宽字符和窄字符编译模式下有不同的映射。设置它可以决定_TCHAR在编译时对应`wchar_t`还是`char`类型。 2. **Debug Configuration**:调试配置主要关注于调试...

    wince.net platform builder 使用简介

    - 在 Platform Builder 中,可以通过配置不同的调试模式来满足不同的测试需求。 - 选择合适的调试配置,以便后续进行调试工作。 ##### **步骤2:新增应用软件到 Platform** - **添加应用程序**:通过添加额外的应用...

    腊月一十八,聊聊 MyBatis 中的设计模式.docx

    Builder 模式的定义是“将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”它属于创建类模式,一般来说,如果一个对象的构建比较复杂,超出了构造函数所能包含的范围,就可以使用工厂...

    Oracle WareHourse Builder 配置文档

    * Configuration:OWB 的配置过程,包括设置目标模式、创建模块、设计映射等步骤。 创建目标模式 * Create Target Schema:在 OWB 中创建目标模式的过程,包括创建数据库连接、创建模式、创建表格等步骤。 Orcle ...

    EPKS Control Configuration Guidelines (EPKS系统组态原则)

    本文档《EPKS Control Configuration Guidelines》提供了使用Configuration Studio进行EPKS系统配置和C300控制器组态的原则和步骤,适用于R43x至最新的R520版本。 1. **Configuration Studio** Configuration ...

    计算机软件-编程源码-Builder固定资产管理系统java项目源码.zip

    在Java编程中,Builder模式是一种设计模式,常用于构建复杂对象,它将对象的创建过程逐步分解,使得构建过程和表示分离,提供了更灵活的构造方式。在这个项目中,Builder模式可能被用来组织和构建固定资产对象,使得...

    springboot2.1.4集成rabbitmq,三种模式:fanout direct topic的实现

    总结来说,Spring Boot 2.1.4与RabbitMQ的集成提供了丰富的消息传递能力,通过Fanout、Direct和Topic模式可以灵活地处理不同场景下的消息路由需求。在实际项目中,可以根据业务需求选择合适的模式,实现高效、可靠的...

    LGT8F690A快速开发系列教程第三篇_时钟配置(1)1

    配置位的设置可以在SDK Builder的“Configuration Words”页面中完成,确保主时钟源设置为默认的内部16MHz RC振荡器。 完成配置后,点击“Build”按钮生成SDK代码,并在“PINOUT VIEW”中查看RA3引脚的CLKO输出功能...

    springboot整合spark连接远程服务计算框架使用standAlone模式

    本文将深入探讨如何将Spring Boot与Spark集成,并使用Standalone模式来实现远程服务计算。 首先,我们需要了解Spark Standalone模式。这是Spark自带的一种资源管理器,可以独立于其他集群管理器(如YARN或Mesos)...

    03 mybatis高级(2) 3

    **与工厂模式的区别** 建造者模式和工厂模式的主要区别在于: - **对象复杂度**:建造者模式适用于创建复杂对象,而工厂模式更关注于简单对象的创建。 - **客户端参与程度**:建造者模式中,客户端需要指定具体...

    prog.rar_技术管理_C++_Builder_

    在描述中提到的"this is a desktop configuration file"表明这个压缩包可能包含了用于配置C++ Builder开发环境或者与桌面应用相关的设置文件。桌面配置文件通常包含用户界面布局、快捷方式、启动参数等信息,对于...

    Design Patterns in Java

    - **建造者模式**(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - **原型模式**(Prototype Pattern):用原型实例指定创建对象的种类,并通过复制这些原型...

    SpringBoot-Mybatis-MultipleDataSource(主主模式).zip

    通过以上步骤,我们就能在Spring Boot项目中成功地配置了主主模式的多数据源,并与Mybatis进行集成。这种方式可以有效地支持大型分布式系统的扩展性和数据一致性,同时也提高了系统的灵活性和可维护性。在实际项目中...

    Mybatis源码分析

    1. Configuration:管理mysql-config.xml全局配置关系类。 2. SqlSessionFactory:管理工厂接口,提供了对数据库的连接和操作。 3. Session:SqlSession是一个面向用户(程序员)的接口,提供了很多操作数据库的方法...

    Spring Boot整合RabbitMQ实例(Topic模式)

    return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message"); } } ``` 在上面的代码中,我们定义了两个队列、一个交换器和一个绑定关系。通过使用 `@Bean` 注解,我们可以将队列、交换器和...

    Hibenate基础

    StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); SessionFactory sessionFactory = configuration.buildSessionFactory(builder....

    vue-dynamic-form:vue+antd实现的动态表单,可拖拽,可响应式,完全自定义布局

    form-builder技术栈: 基于VUE2.x + ant-design-vue 1.6.2 + sortable.js(拖拽) 实现的动态表单功能,支持编辑模式,表格模式,详情模式代码按单元组件模块式划分,结构清晰、维护简单 (2核1G服务器,请勿攻击)...

    C#程序配置读写例子,Option

    总的来说,C#中的配置读写涉及到`System.Configuration`、`Microsoft.Extensions.Configuration`等库,以及`Options`模式,它们为开发人员提供了方便且强大的管理配置的方法。通过理解和熟练运用这些知识,我们可以...

    .net core 3.1 获取配置文件 编写了一个类库,可以拿来使用,如有不正出,请斧正.

    IConfigurationRoot configuration = builder.Build(); ``` 现在,我们转向描述中提到的类库。这个类库名为`ConfigHandle`,可能是为了简化配置读取而设计的。它可能包含了对`IConfiguration`接口的封装,提供了...

    Android 画中画(PIP)Demo

    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration config) { super.onPictureInPictureModeChanged(isInPictureInPictureMode, config); if ...

Global site tag (gtag.js) - Google Analytics