理解java设计模式之建造者模式

 更新时间:2016年02月13日 17:12:13   作者:cutter_point  
这篇文章主要帮助大家理解java设计模式之建造者模式,对建造者模式,即生成器模式进行实例讲解,感兴趣的朋友可以参考一下

建造者模式(Builder Pattern)主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。因此, 建造者模式主要用来解决“对象部分”的需求变化。 这样可以对对象构造的过程进行更加精细的控制。

package com.shejimoshi.create.Builder;
/**
 * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
 *     适用性:
 *       当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
 *       当构造过程必须允许被构造的对象有不同的表示时
 */
public abstract class PersonBuilder
{
  //绘画一个人物需要使用到的工具
  protected String tool1;
  protected String tool2;
  
  public PersonBuilder(String t1, String t2)
  {
    this.tool1 = t1;
    this.tool2 = t2;
  }
  
  //绘画头
  public abstract void buildHead();
  //画身体
  public abstract void buildBody();
  //画左脚右脚
  public abstract void buildArmLeft();
  public abstract void buildArmRight();
  //画左手右手
  public abstract void buildLegLeft();
  public abstract void buildLegRight();
}

我们的抽象生成器派生出相应的子类,用来构造相应的实际使用类型

package com.shejimoshi.create.Builder;


/**
 * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
 *     适用性:
 *       当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
 *       当构造过程必须允许被构造的对象有不同的表示时
 */
public class PersonThinBuilder extends PersonBuilder
{

  public PersonThinBuilder(String t1, String t2)
  {
    super(t1, t2);
  }

  @Override
  public void buildHead()
  {
    System.out.println("画出一个瘦子的头");
  }

  @Override
  public void buildBody()
  {
    System.out.println("画出一个瘦子的身体");
  }

  @Override
  public void buildArmLeft()
  {
    System.out.println("画出瘦子的左臂");
  }

  @Override
  public void buildArmRight()
  {
    System.out.println("画出瘦子的右臂");
  }

  @Override
  public void buildLegLeft()
  {
    System.out.println("画出瘦子左腿");
  }

  @Override
  public void buildLegRight()
  {
    System.out.println("画出瘦子的右腿");
  }

}

package com.shejimoshi.create.Builder;


/**
 * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
 * 适用性:
 *    当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
 *    当构造过程必须允许被构造的对象有不同的表示时
 */
public class PersonFatBuilder extends PersonBuilder
{

  public PersonFatBuilder(String t1, String t2)
  {
    super(t1, t2);
  }

  @Override
  public void buildHead()
  {
    System.out.println("画出一个胖子的头");
  }

  @Override
  public void buildBody()
  {
    System.out.println("画出一个胖子的身体");
  }

  @Override
  public void buildArmLeft()
  {
    System.out.println("画出胖子的左臂");
  }

  @Override
  public void buildArmRight()
  {
    System.out.println("画出胖子的右臂");
  }

  @Override
  public void buildLegLeft()
  {
    System.out.println("画出胖子左腿");
  }

  @Override
  public void buildLegRight()
  {
    System.out.println("画出胖子的右腿");
  }

}

我们的生成器交给指挥者来实现创建的动作

package com.shejimoshi.create.Builder;


/**
 * 功能:创建人物的指挥者
 */
public class PersonDirector
{
  private PersonBuilder pb;
  
  //传递相应的人物创建模型
  public PersonDirector(PersonBuilder pber)
  {
    this.pb = pber;
  }
  
  //创建一个人
  public void createPerson()
  {
    pb.buildHead();
    pb.buildBody();
    pb.buildArmLeft();
    pb.buildArmRight();
    pb.buildLegLeft();
    pb.buildLegRight();
  }
}

测试案例:

package com.shejimoshi.create.Builder;


/**
 * 功能:客户端程序
 */
public class Test
{
  //创建相应的人物
  public static void create(PersonBuilder pb)
  {
    //借助参数传过来的模型创建相应的对象
    PersonDirector pd = new PersonDirector(pb);
    pd.createPerson();
  }
  
  public static void main(String []args)
  {
    PersonThinBuilder ptb = new PersonThinBuilder("图像工具", "画笔");
    create(ptb); //创建一个瘦子
    System.out.println("==============================================================");
    PersonFatBuilder pfb = new PersonFatBuilder("图像工具", "画笔");
    create(pfb);
  }
}

运行结果:

画出一个瘦子的头
画出一个瘦子的身体
画出瘦子的左臂
画出瘦子的右臂
画出瘦子左腿
画出瘦子的右腿
==============================================================
画出一个胖子的头
画出一个胖子的身体
画出胖子的左臂
画出胖子的右臂
画出胖子左腿
画出胖子的右腿

以上就是java建造者模式,希望对大家学习java程序设计有所帮助。

相关文章

  • 使用java批量写入环境变量的实现

    使用java批量写入环境变量的实现

    本文主要介绍了使用java批量写入环境变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Java中定时器Timer致命缺点案例详解

    Java中定时器Timer致命缺点案例详解

    这篇文章主要介绍了Java中定时器Timer致命缺点,以Java中定时器Time为案例整理下我的学习方法,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java并发工具类之CountDownLatch详解

    Java并发工具类之CountDownLatch详解

    这篇文章主要介绍了Java并发工具类之CountDownLatch详解,CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景,需要的朋友可以参考下
    2023-12-12
  • 初学者,Spring快速入门

    初学者,Spring快速入门

    本文主要讲解了Spring框架的基础知识,Spring是一个轻量级的开源框架,它是为简化企业级应用开发而生。文中运用代码非常详细的介绍了相关知识,需要了解的小伙伴可以参考一下哦
    2021-09-09
  • Spring @ComponentScan注解扫描组件原理

    Spring @ComponentScan注解扫描组件原理

    这篇文章主要介绍了Spring @ComponentScan自动扫描组件使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • springboot参数传中文乱码的解决方案

    springboot参数传中文乱码的解决方案

    这篇文章主要介绍了springboot参数传中文乱码的解决方案,帮助大家更好的理解和学习使用springboot,感兴趣的朋友可以了解下
    2021-03-03
  • 一招教你优化Java代码中大量的if/else

    一招教你优化Java代码中大量的if/else

    当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅的优化掉这些多余的if/else?本文就来和大家详细聊聊
    2023-03-03
  • 解决springboot项目不配置数据源启动报错问题

    解决springboot项目不配置数据源启动报错问题

    这篇文章主要介绍了解决springboot项目不配置数据源启动报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java外部类与内部类的关系详解

    java外部类与内部类的关系详解

    本文详细讲解了java外部类与内部类的关系,用代码演示了外部类调用内部类的方法。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • kafka生产者发送消息流程深入分析讲解

    kafka生产者发送消息流程深入分析讲解

    本文将介绍kafka的一条消息的发送流程,从消息的发送到服务端的存储。上文说到kafak分为客户端与服务端,要发送消息就涉及到了网络通讯,kafka采用TCP协议进行客户端与服务端的通讯协议
    2023-03-03

最新评论