1. 程式人生 > >設計模式面試——四種最常用的設計模式

設計模式面試——四種最常用的設計模式

請說出你所熟悉的幾種設計模式。並舉例說明:

下面列舉四種最常用的設計模式


一、Strategy模式

1、兩大原則
Strategy模式體現瞭如下的兩大原則:
1,針對介面程式設計,而不是針對實現程式設計。
2,多用組合,少用繼承。
2、 例子:


二、Iterator模式

提供一種方法順序訪問一個聚合物件中各個元素, 而又不需暴露該物件的內部表示。
這種設計模式非常普遍,
比如Java裡面的:
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
以及C++ STL裡面的 iterator使用 ++ 訪問。

三、Singleton模式


下面是個C++ singleton的類:

  1. 1 #ifndef SINGLETON_H  
  2. 2 #define SINGLETON_H  
  3. 3  
  4. 4 #include "synobj.h"
  5. 5  
  6. template<class T>  
  7. class Singleton {  
  8. 8   CLASS_UNCOPYABLE(Singleton)  
  9. public:  
  10. 10   static T& Instance() { // Unique point of access
  11. 11   if (0 == _instance) {  
  12. 12     Lock lock(_mutex);  
  13. 13     if
     (0 == _instance) {  
  14. 14     _instance = new T();  
  15. 15     atexit(Destroy);  
  16. 16     }  
  17. 17   }  
  18. 18   return *_instance;  
  19. 19   }  
  20. 20 protected:  
  21. 21   Singleton(){}  
  22. 22   ~Singleton(){}  
  23. 23 private:  
  24. 24   staticvoid Destroy() { // Destroy the only instance
  25. 25   if ( _instance != 0 ) {  
  26. 26     delete _instance;  
  27. 27     _instance = 0;  
  28. 28   }  
  29. 29   }  
  30. 30   static Mutex _mutex;  
  31. 31   static T * volatile _instance; // The one and only instance
  32. 32 };  
  33. 33  
  34. 34 template<class T>  
  35. 35 Mutex Singleton<T>::_mutex;  
  36. 36  
  37. 37 template<class T>  
  38. 38 T * volatile Singleton<T>::_instance = 0;  
  39. 39  
  40. 40 #endif/*SINGLETON_H*/


四、Factory Method模式
Factory Method模式在不同的子工廠類生成具有統一介面介面的物件,一方面,可以不用關心產品物件的具體實現,簡化和統一Client呼叫過程;另一方面,可以讓整個系統具有靈活的可擴充套件性。
  1. abstract class BallFactory{  
  2. protected abstract Ball makeBall(); //Factory Method
  3. }  
  4. class BasketballFact extends BallFactory{  
  5. public Ball makeBall(){    //子類實現Factory Method決定例項化哪一個類的
  6.  returnnew Basketball();  
  7. }  
  8. }  
  9. class FootballFact extends BallFactory{  
  10. public Ball makeBall(){   //子類實現Factory Method決定例項化哪一個類的
  11.  returnnew Football();  
  12. }  
  13. }  
  14. class Basketball extends Ball{  
  15. publicvoid play(){  
  16.  System.out.println("play the basketball");  
  17. }  
  18. }  
  19. class Football extends Ball{  
  20. publicvoid play(){  
  21.  System.out.println("play the football");  
  22. }  
  23. }  
  24. abstract class Ball{  
  25. protected abstract void play();  
  26. }  
  27. publicclass test{  
  28. publicstaticvoid main(String[] args){  
  29.  BallFactory ballFactory=new BasketballFact();  
  30.  Ball basketball=ballFactory.makeBall();  
  31.  basketball.play();  
  32.  ballFactory=new FootballFact();  
  33.  Ball football=ballFactory.makeBall();  
  34.  football.play();  
  35. }  
  36. }