热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

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

这篇文章主要帮助大家理解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程序设计有所帮助。


推荐阅读
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 智能投顾机器人:创业者如何应对新挑战?
    随着智能投顾技术在二级市场的兴起,针对一级市场的智能投顾也逐渐崭露头角。近日,一款名为阿尔妮塔的人工智能创投机器人正式发布,它将如何改变投资人的工作方式和创业者的融资策略? ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 本篇文章介绍如何使用Python编写一个程序,用于判断用户输入的变量名是否符合Python的命名规则。程序通过检查首字符和后续字符的合法性,确保变量名符合标准。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 云屏系统基于嵌入式微系统msOS,旨在解决当前嵌入式彩屏GUI编程中硬件要求高、软件开发复杂、界面效果不佳等问题。该系统通过结合MCU和Android技术,利用Html5+JavaScript实现高效、易用的图形用户界面开发,使嵌入式开发人员能够专注于业务逻辑。 ... [详细]
  • 本文记录了作者在学习验证码识别过程中,针对粘连字符分割的探索与实践。通过对多种算法的研究和应用,总结出有效的解决方案,并分享了相关经验和技巧。 ... [详细]
  • 江苏启动鲲鹏生态产业园首批应用孵化项目
    2019年9月19日,在华为全联接大会上,江苏鲲鹏生态产业园正式启动了首批鲲鹏应用孵化项目。南京市委常委、江北新区党工委专职副书记罗群等多位嘉宾出席并见证了这一重要时刻。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 724. 寻找数组的中轴索引
    给定一个整数数组 `nums`,编写一个方法返回该数组的“中轴”索引。定义中轴索引为该索引左侧所有数字之和等于右侧所有数字之和的索引。如果不存在这样的索引,则返回 -1。如果有多个中轴索引,返回最左边的一个。 ... [详细]
  • 探讨了在处理无限列表时,从右侧折叠操作的成功与失败原因,特别是针对不同数据类型的实现差异。 ... [详细]
  • 本文详细记录了一位具有五年半开发经验的候选人,在华为Android高级开发职位面试过程中的经历。从早晨9点到下午5点半,经过了群体面试、技术面试、综合面试及英语面试等多个环节,最终成功通过考核。文章不仅分享了面试心得,还提供了宝贵的面试题资源。 ... [详细]
  • 序列化与反序列化是数据处理中的重要技术,特别是在网络通信和数据存储中。它们允许将复杂的数据结构转换为可传输或存储的格式,再从这些格式恢复原始数据。本文探讨了序列化与反序列化的基本概念,以及它们在不同协议模型中的角色。 ... [详细]
  • 本文探讨了使用数字万用表进行小电阻精确测量的方法,重点介绍了四线测量技术和馈线电阻补偿技术,旨在减少测量过程中的误差,提高测量精度。 ... [详细]
  • 本文探讨了Ackermann函数的非递归实现方式,通过使用辅助数组来避免传统递归方法中的栈溢出问题,同时提供了详细的算法步骤。 ... [详细]
author-avatar
排骨冬菇面
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有