隨著科技的進步,電腦製造成本下降與運算能力提升,電腦能做的工作越來越多以應付繁雜的日常需求,隨著高階語言的出現(為了應付需求),我們也因能開發出更為複雜的程式。人們因應不同的需求而設計不同的軟體,但在軟體開發的過程中卻有許多困難逐漸浮現,程式的開發也已經不是一人就能獨立完成的,客戶需要一個能解決他們問題的程式(或軟體),這可能是一個複雜的軟體,程式碼數量邁入十萬、百萬行。而為了要開發複雜的系統,就要對系統做分解。要如何分解?便要分析、並進行設計。這個過程中很多人提出各式各樣的看法、做了許多研究,便有許多設計方法出現,例如:以方法切割像組織架構一樣從上而下的結構化設計、關注於資料的輸入與得到的輸出結果的資料驅動設計、以物件來分解的物件導向設計。
而隨著程式開發的經驗累積,往往優先選擇以物件的觀點來拆解系統。一來物件的觀點可以把大型系統拆成多個獨立小系統的組合,二來我們程式的開發每次也是從小系統著手開始。能說是因為從小系統開始比較好理解,靠著逐漸改進與擴充來構成大型系統。切成較小的物件也能降低大型系統開發過程中因為需求變更而導致設計變更的程式重寫風險。而要怎麼讓我們切割出高重複利用率的物件,要如何讓我們系統變的更有彈性,就會提出許許多多的方法與理論。這些方法與理論隨著時間累積而演變成我們現在聽到的設計原則與設計模式。