Der Entwurf von Systemen findet in den seltensten Fällen „auf der grünen Wiese“ und ohne jegliche vorhergehenden Erfahrungen statt. Besonders in den mittleren Abstraktionsebenen Architektur und Entwurf war seit Mitte der Neunziger Jahre eine Vereinheitlichung und Wiederverwendung von abstrakten Ideen zu beobachten. Architektonische Stile und Muster beschreiben erprobte Lösungen für häufig wiederkehrende Strukturierungsprobleme auf den beiden Abstraktionsebenen.
Die Hauptidee der Muster liegt darin, abstraktes Wissen über erfahrungsgemäß erfolgreiche Lösungen zu konservieren, indem der Lösungsstrategie ein eindeutiger Name gegeben wird. Dies ist eine sinnreiche Erweiterung des Vokabulars von Software-Entwicklern, weil allein mit der Nennung eines Begriffs klar ist, um welches spezielle Problem in welchem Kontext es sich handelt und wie die Lösung in einer bestimmten Modellsprache aussieht. Rund um das Thema Muster existiert eine eigene Community und immer wieder entstehen neue „Mustersprachen“ für eigene Problembereiche. Am bekanntesten sind sicherlich die objektorientierten Entwurfsmuster nach Gamma et al. [ GHJV94]. Einen weitreichenderen Überblick über verschiedene Arten von Mustern gibt beispielsweise [ BMR+96].
Üblicherweise werden Muster verschiedener Granularitätsstufen voneinander unterschieden:
Architekturmuster (auch: architektonische Stile) drücken generelle Organisationsschemata für Software-Systeme aus. Sie definieren Subsysteme mit dedizierten Verantwortlichkeiten und Regeln, nach denen Subsysteme zueinander in Beziehung stehen. Ein Architekturmuster definiert eine Familie von Architekturen mit dediziertem Vokabular für Komponenten und Verbindungselementen, einer spezifischen Topologie und semantischen Beschränkungen. Etwa in einer Schichtenarchitektur werden die Module eines System grob in mehreren Schichten angeordnet und die wesentliche Beschränkung ist, dass jedes Modul nur Funktionen eines darunter befindlichen Moduls nutzen darf.
Entwurfsmuster (engl. „design patterns“) auf der Ebene des Feinentwurfs nach [ GHJV94]. Sie geben Lösungen für häufig anzutreffende Entwurfsprobleme vor, nach denen Beschränkungen aus der Architektur umgesetzt werden können. Die Beschreibung bezieht Besonderheiten einer Entwurfsmethode (meist objektorientierte Methode) mit ein. Gamma et al. unterscheiden in ihrer Klassifikation weiter Verhaltensmuster, Strukturmuster und erzeugende Muster. Beispielsweise das Beobachter-Muster ist ein Verhaltensmuster und beschreibt, wie konkrete objektorientierte Ausdrucksmittel einzusetzen sind, um den Zustand mehrer Objekte untereinander konsistent zu halten.
Idiome beschreiben Lösungen für generelle Implementierungsprobleme und sind auf einzelne Programmiersprachen zugeschnitten. Beispielsweise das „Reference Counting“ meint, dass die zur Laufzeit existierenden Instanzen einer Klasse gezählt werden, um z.B. das Speichermanagement effektiver zu machen.