设计模式 之 什么是设计模式?

来源:互联网 发布:java文件夹命名规则 编辑:程序博客网 时间:2024/06/04 23:28

什么是设计模式?

我们在发现问题到解决问题这个过程中,常会发现很多问题是重复出现的,或是某个问题的变体,外在不同,而本质相同,建筑学上如是,软件行业也是,这些问题的本质就是模式。

这里给出项目中经常遇到的一个问题,配置文件读取问题。假如我们在项目中有一个配置文件(Properties),在运行时需要从它里面读取内容,我们可能会出现如下代码来读取文件:

Java代码
  1. public static String getProperty(String propKey) throws Exception{  
  2.     Properties prop = new Properties();  
  3.     InputStream propConfFile = Util.class.getClassLoader().getResourceAsStream("configure.properties");  
  4.     //载入propConfFile到prop中,从prop中获取propKey的值,并将其返回  
  5.     //进一步操作...  
  6.     return property;  
  7. }  

这里大家可以看到,每次我们要获取一个配置项,都需要去读取一次文件,这样的消耗是比较大的。而我们也知道,在产品系统(客户上线系统)中,配置项一般是不变的,所以这里的代码的代价就显得比较高了(如果是在开发阶段这样的代码是可以接收的),并且如果出现高并发有可能会出现文件读取上的瓶颈(多个线程访问同一个文件)。这里我们可以引入一个模式来解决这个问题。既然配置项是不变的,我们可以引入一个单例来解决这个问题,如:

Java代码
  1. import //略  
  2. public class PropertiesUtil ...{  
  3.     private static Map propertiesMap = null;  
  4.     public static String getProperty(String propKey) throws Exception ...{  
  5.        if (propertiesMap == null) ...{  
  6.         //当propertiesMap为空时,载入文件,将其键值对放入propertiesMap中(略)  
  7.        }  
  8.        //在propertiesMap中获得propKey属性,并将值返回(略)  
  9.     }  
  10. }  

上述代码不是经典的单例模式。这里能找到的单例是其中的Map,我们可以看到在PropertiesUtil中,该Map只可能存在一个实例。这样我们就可以保证只有一个实例的存在,也可以避免多次加载配置文件的问题。注意,这里没有考虑多线程,如果需要考虑需要在if(propertiesMap == null)里加入对线程的控制。

关于设计模式的概念,我在这里先给出一个我认为比较准确的概念。如下:

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就可以一次又一次的使用该解决方案而不做重复性的劳动。设计模式有四个基本要素:模式名称问题解决方案效果