1. 程式人生 > 實用技巧 >vijos難解的問題(LIS最長上升子序列)

vijos難解的問題(LIS最長上升子序列)

工廠模式的作用:用於生產類物件

工廠模式分類:簡單工廠模式、工廠模式、抽象工廠模式

工廠模式的特點:

  (1)工廠模式是一種設計模式,遵循開閉原則,

   – 開放, 對新增的功能是開放的。

– 關閉, 對以前的已經完成的功能時不允許修改的。

(2)封裝物件的建立過程,可以輕而易舉的獲得一個可用的物件。

(3)解耦合,降低類和類之間的耦合度,修改一個類不會影響另一個類。

(4)降低程式碼的重複性,提高程式碼的可讀性


下面主要介紹常用的工廠模式, 簡單工廠模式和抽象工廠模式在此不介紹,感興趣的可以自行學習。

工廠模式遵循開閉原則:

    – 每建立一個物件, 就應該對應一個工廠類, 工廠類需要有很多個

    – 這些建立物件的工廠類之間是什麼關係?

      • 兄弟關係

    – 這些建立物件的工廠類需要有相同的基類

      • 目的: 為了實現多型, 讓程式碼的呼叫更加靈活

工廠模式使用流程

  1. 建立一個工廠類的基類, 在這個基類中新增一個虛擬函式, 這個虛擬函式就是用於物件建立的工廠函式。

  2. 基於這個工廠類建立若干個子工廠類, 在子工廠類中實現父類的虛擬函式。

  3. 如果需要建立更多的物件, 再次新增子工廠類即可。

工廠模式的特點: 對於已經實現的程式碼是不做任何修改的, 如果有新的需求, 新增新的程式碼。


工廠模式實現程式碼:

  1 // 物件基類
  2 #include <cstdlib>
  3 #include <iostream>
  4 using namespace std;
  5 class BaseObject
  6 {
  7 public:
  8     BaseObject();
  9     ~BaseObject();
 10     virtual void funcA()
 11     {
 12         cout << "BaseObject-----funcA" << endl;
 13     }
14 15 private: 16 17 }; 18 19 BaseObject::BaseObject() 20 { 21 } 22 23 BaseObject::~BaseObject() 24 { 25 } 26 /*******************************/ 27 class AObject:public BaseObject 28 { 29 public: 30 AObject(); 31 ~AObject(); 32 void funcA(); 33 34 private: 35 36 }; 37 38 AObject::AObject() 39 { 40 } 41 42 AObject::~AObject() 43 { 44 } 45 46 void AObject::funcA() 47 { 48 cout << "AObject --- funcA" << endl; 49 } 50 51 /*************************/ 52 class BObject:public BaseObject 53 { 54 public: 55 BObject(); 56 ~BObject(); 57 void funcA(); 58 59 private: 60 61 }; 62 63 BObject::BObject() 64 { 65 } 66 67 BObject::~BObject() 68 { 69 } 70 void BObject::funcA() 71 { 72 cout << "BObject----funcA" << endl; 73 } 74 75 76 /*************************************************************/ 77 // 工廠類基類 78 class BaseFactory 79 { 80 public: 81 BaseFactory(); 82 ~BaseFactory(); 83 // 建立物件的工廠方法 84 virtual BaseObject* createObject() 85 { 86 cout << "BaseFactory --- createObject" << endl; 87 return NULL; 88 } 89 90 private: 91 92 }; 93 94 BaseFactory::BaseFactory() 95 { 96 } 97 98 BaseFactory::~BaseFactory() 99 { 100 } 101 /**********************************************************/ 102 // 子工廠類, 只生產AObject類物件 103 class AFactory:public BaseFactory 104 { 105 public: 106 AFactory(); 107 ~AFactory(); 108 109 BaseObject* createObject(); 110 111 private: 112 113 }; 114 115 AFactory::AFactory() 116 { 117 } 118 119 AFactory::~AFactory() 120 { 121 } 122 123 BaseObject* AFactory::createObject() 124 { 125 cout << "AFactory---createObject" << endl; 126 BaseObject* c = new AObject; 127 return c; 128 } 129 130 /***************************************************/ 131 class BFactory:public BaseFactory 132 { 133 public: 134 BFactory(); 135 ~BFactory(); 136 BaseObject* createObject(); 137 138 private: 139 140 }; 141 142 BFactory::BFactory() 143 { 144 } 145 146 BFactory::~BFactory() 147 { 148 } 149 150 BaseObject* BFactory::createObject() 151 { 152 cout << "BFactory----createObject" << endl; 153 BaseObject* c = new BObject(); 154 return c; 155 } 156 157 /*************************************************************/ 158 int main() 159 { 160 // 工廠類使用 161 BaseFactory* bf = new AFactory(); 162 BaseObject* ao = bf->createObject(); 163 ao->funcA(); 164 165 bf = new BFactory(); 166 ao = bf->createObject(); 167 ao->funcA(); 168 169 system("pause"); 170 return EXIT_SUCCESS; 171 }