之前写了好多关于排序算法的文章,基本上都是总结性质的,其实排序算法的研究很细致,但是我的博客都基本上只是给出了大体的思路和Java程序实现,算法写起来比较繁琐,感兴趣的话,自己去研究下吧,我推荐算法导论这本书。
看到这么多的排序算法,如果要将其真正用到Java程序里边的话,未免也太复杂了,因为要为每一种算法在使用之前都要先创建一个实例,然后才能使用,这样就暴露了实现,不符合面向对象的基本要求,因此建立一个工厂类,然后让工厂来负责具体的算法的创建,客户端程序员就不必知道具体的算法了,而且,这样做就可以统一接口。
简单工厂的本质是:封装实现。
需要注意的是简单工厂的重点在于选择,实现是已经做好了的。简单工厂的目的为在于客户端来选择相应的实现,从而使得客户端和实现之间的解耦。这样一来,具体的实现,就不用变动客户端的代码了,这个变化会被简单工厂吸收和屏蔽。
使用我之前写过的算法的例子,可以这样来应用简单工厂模式。
首先,建立一个具体算法的接口,实现面向接口的编程。接口定义如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
然后,建立每一个算法的具体实现,每一个算法都要实现这个接口。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
接下来,建立一个工厂类来为客户端选择具体的算法实现。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
其中反射用的配置文件如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
当然,还有之前简化的打印类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
还有定义算法名称的常量类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
最后,来写一个测试类来测试一下吧!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
输出为:
原始数组:
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
从这个结果可以看出,所有的算法都能完成排序的工作,而且用了简单工厂模式之后,客户端程序就再也不需要知道具体的排序算法的实现了。