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

所属分类: 软件编程 / java 阅读数: 35
收藏 0 赞 0 分享

建造者模式(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程序设计有所帮助。

更多精彩内容其他人还在看

Springmvc restful配置遇到的小坑

本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
收藏 0 赞 0 分享

Java中的匿名内部类小结

java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。这篇文章主要介绍了Java中的匿名内部类的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java的云打印Lodop

这篇文章主要介绍了Java的云打印Lodop 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java线程池框架核心代码解析

这篇文章主要针对Java线程池框架核心代码进行详细解析,分析Java线程池框架的实现ThreadPoolExecutor,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java 交换两个变量的数值实现方法

下面小编就为大家带来一篇Java 交换两个变量的数值实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

全面了解JAVA_BaseDAO数据处理类

下面小编就为大家带来一篇全面了解JAVA_BaseDAO数据处理类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java、python、JavaScript以及jquery循环语句的区别

本篇文章主要介绍java、python、JavaScript以及jquery的循环语句的区别,这里整理了它们循环语句语法跟示例,以便大家阅读,更好的区分它们的不同
收藏 0 赞 0 分享

基于JDBC封装的BaseDao(实例代码)

下面小编就为大家带来一篇基于JDBC封装的BaseDao(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

简单通用JDBC辅助类封装(实例)

下面小编就为大家带来一篇简单通用JDBC辅助类封装(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈java线程中生产者与消费者的问题

下面小编就为大家带来一篇浅谈java线程中生产者与消费者的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多