Fork me on GitHub
选择实现—简单工厂

之前写了好多关于排序算法的文章,基本上都是总结性质的,其实排序算法的研究很细致,但是我的博客都基本上只是给出了大体的思路和Java程序实现,算法写起来比较繁琐,感兴趣的话,自己去研究下吧,我推荐算法导论这本书。

  看到这么多的排序算法,如果要将其真正用到Java程序里边的话,未免也太复杂了,因为要为每一种算法在使用之前都要先创建一个实例,然后才能使用,这样就暴露了实现,不符合面向对象的基本要求,因此建立一个工厂类,然后让工厂来负责具体的算法的创建,客户端程序员就不必知道具体的算法了,而且,这样做就可以统一接口。

  简单工厂的本质是:封装实现

  需要注意的是简单工厂的重点在于选择,实现是已经做好了的。简单工厂的目的为在于客户端来选择相应的实现,从而使得客户端和实现之间的解耦。这样一来,具体的实现,就不用变动客户端的代码了,这个变化会被简单工厂吸收和屏蔽。

  使用我之前写过的算法的例子,可以这样来应用简单工厂模式。

  首先,建立一个具体算法的接口,实现面向接口的编程。接口定义如下:

  

SortAlgorithm.java

  然后,建立每一个算法的具体实现,每一个算法都要实现这个接口。

  

InsertionSort.java
MergeSort.java
HeapSort.java
QuickSort.java

  接下来,建立一个工厂类来为客户端选择具体的算法实现。

SortFactory.java

  其中反射用的配置文件如下:

FactoryConfig.properties

  当然,还有之前简化的打印类:

Print.java

  还有定义算法名称的常量类:

AlgorithmConstants.java

  最后,来写一个测试类来测试一下吧!

SortMain.java

  输出为:

  原始数组:
  23,45,36,78,45,16,59,62,569
  插入排序,升序排列:
  16,23,36,45,45,59,62,78,569
  插入排序,降序排列:
  569,78,62,59,45,45,36,23,16
  合并排序,升序排列:
  16,23,36,45,45,59,62,78,569
  合并排序,降序排列:
  569,78,62,59,45,45,36,23,16
  最大堆排序,升序排列:
  16,23,36,45,45,59,62,78,569
  最小堆排序,降序排列:
  569,78,62,59,45,45,36,23,16
  快速排序,升序排列:
  16,23,36,45,45,59,62,78,569
  快速排序,降序排列:
  569,78,62,59,45,45,36,23,16

  从这个结果可以看出,所有的算法都能完成排序的工作,而且用了简单工厂模式之后,客户端程序就再也不需要知道具体的排序算法的实现了。

 

 
标签: 设计模式
posted on 2012-05-02 10:18  HackerVirus  阅读(148)  评论(0编辑  收藏  举报