基于Java的建造设计模式

2016-01-29 12:59 4 1 收藏

基于Java的建造设计模式,基于Java的建造设计模式

【 tulaoshi.com - Java 】

  一、引子

  前几天陪朋友去装机店攒了一台电脑,看着装机工在那里熟练的装配着机器,不禁想起来了培训时讲到的建造模式。作为装机工,他们不用管你用的CPU是Intel还是AMD,也不管你的显卡是2000千大元还是白送的,都能挛宄淖芭湓谝黄稹惶≒C就诞生了!当然对于客户来说,你也不知道太多关于PC组装的细节。这和建造模式是多么的相像啊!

  今天就来探讨一下建造模式

  二、定义与结构

  GOF给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。可以将建造模式的精髓概括为:将构造复杂对象的过程和对象的部件解耦。这是对降低耦合、提高可复用性精神的一种贯彻。其实这种精神贯彻在GOF几乎所有的设计模式中。

  是不是和上面提到的装机流程相像?

  这个很多人认为同抽象工厂模式相似的建造模式用在什么样的设计环境下呢(对于两者的比较稍候讨论)?我认为可以总结为以下环境:当要生成的产品有复杂的内部结构,其中的内部结构由多个对象组成;系统将来可能要改变产品对象的内部结构的构成或者实现方式,比如说产品的一些属性现在是从数据库中得到的,而将来可能从XML中解析得到;而且不能将产品的内部构造完全暴露给客户程序,一是为了可用性,二是为了安全等因素。满足上面的设计环境就可以考虑使用建造模式来搭建框架了。 来看看建造模式的组成吧。

  抽象建造者角色:这个角色用来规范产品对象的各个组成成分的建造。一般而言,此角色独立于应用程序的商业逻辑。

  具体建造者角色:担任这个角色的是于应用程序紧密相关的类,它们在指导者的调用下创建产品实例。这个角色在实现抽象建造者角色提供的方法的前提下,达到完成产品组装,提供成品的功能。

  指导者角色:调用具体建造者角色以创建产品对象。指导者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。 产品角色:建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。

  首先客户程序创建一个指导者对象,一个建造者角色,并将建造者角色传入指导者对象进行配置。然后,指导者按照步骤调用建造者的方法创建产品。最后客户程序从建造者或者指导者那里得到产品。

  从建造模式的工作流程来看,建造模式将产品的组装“外部化”到了建造者角色中来。这是和任何正规的工厂模式不一样的——产品的创建是在产品类中完成的。

  三、实现

  实在找不到太好的例子,我认为《java与模式》中发邮件的例子还算可以。这里我将《Think in Patterns with Java》中的例子放到这里权且充个门面。媒体可以存在不同的表达形式,比如书籍、杂志和网络。这个例子表示不同形式的媒体构造的步骤是相似的,所以可以被提取到指导者角色中去。

  import java.util.*;
  import junit.framework.*;

  //不同的媒体形式:

  class Media extends ArrayList {}
  class Book extends Media {}
  class Magazine extends Media {}
  class WebSite extends Media {}

  // 进而不含不同的媒体组成元素:

  class MediaItem {
  private String s;
  public MediaItem(String s) { this.s = s; }
  public String toString() { return s; }
  }

  class Chapter extends MediaItem {
  public Chapter(String s) { super(s); }
  }

  class Article extends MediaItem {
  public Article(String s) { super(s); }
  }

  class WebItem extends MediaItem {
  public WebItem(String s) { super(s); }
  }

  // 抽象建造者角色,它规范了所有媒体建造的步骤:

  class MediaBuilder {
  public void buildBase() {}
  public void addMediaItem(MediaItem item) {}
  public Media getFinishedMedia() { return null; }
  }

  //具体建造者角色

  class BookBuilder extends MediaBuilder {
  private Book b;
  public void buildBase() {
  System.out.println("Building book framework");
  b = new Book();
  }

  public void addMediaItem(MediaItem chapter) {
  System.out.println("Adding chapter " + chapter);
  b.add(chapter);
  }
  public Media getFinishedMedia() { return b; }
  }

  class MagazineBuilder extends MediaBuilder {
  private Magazine m;
  public void buildBase() {
  System.out.println("Building magazin

来源:https://www.tulaoshi.com/n/20160129/1488390.html

延伸阅读
策略模式其实特别简单(听到这句话,大家是不是心里一下子放松了?)。 比如排序,官方告诉大家我这里有一个排序的接口ISort的sort()方法,然后民间各尽其能,实现这个排序的方法:冒泡,快速,堆等等。 这些方法就是“不同的策略”。 然后,某个模块下,需要一个排序方法,但是暂时不能指定具体的sort方法(出于扩展的考虑),就需要使用ISort接...
摘要 MVC设计模式是基于J2EE的WEB应用开发的首选模式,当前许多流行的框架也都是基于MVC设计模式的。本文简要介绍了MVC设计模式和Struts框架,并提出了一种基于MVC模式的新型WEB应用开发框架WebFramework,并对该框架的各个层次的组成、功能进行了具体的描述。 要害词 MVC设计模式; J2EE;框架; Struts 引言 ...
依然是java 与模式里的例子,(java 与模式 闫宏著) 以下是转为delphi的代码,这次加了注释:) unit BuilderPattern; interface type   TProduct = class;   //抽像建造者 规范接口   TBuilder = class(TObject)   public     procedure builderpart1(); virt...
标签: Java JAVA基础
     一、AOP编程概览 面向对象编程技术进入软件开发的主流对软件的开发方式产生了极大的影响,开发者可以用一组实体以及这些实体之间的关系将系统形象地表示出来,这使得他们能够设计出规模更大、更复杂的系统,开发周期也比以前更短。OO开发的唯一问题是,它本质上是静态的,需求的细微变化就可能对开发进...
如果读者有Java编程经验,尤其是AWT和SWING的Java GUI开发经验将十分有助于理解本文,尽管不是必需的。 一、 引言 近来,移动游戏在提供个人娱乐方面变得越来越流行。这种流行使得移动游戏给手机用户,游戏出版商和手持设备制造者带来丰厚的利润;移动游戏,在给游戏开发者和相关人员带来无数商机的同时,处于极为重要的枢纽位置。据估计,...

经验教程

224

收藏

74
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部