Wie lassen sich abhängig vom Ziel-Betriebssystem zur Laufzeit unterschiedliche Bibliotheken laden?

Das Strategy-Pattern ermöglicht das Kapseln eines beliebigen Algorithmus in einer Klasse, sodass dies zur Laufzeit dynamisch geladen werden kann.

Das Beispiel enthält vier Klassen und ein Interface.
class Strategy ist die Hauptklasse mit der main-Methode und lediglich einer weiteren Methode getInstance(), die ein ClassSelector-Objekt zurück gibt. ClassSelector ist ein Interface, das die Routinen (hier die Methode printOS()) enthält, die von den restlichen drei implementierenden Klassen spezifiziert werden. In diesen wird zu Demonstrationszwecken lediglich der String der ausführenden Plattform ausgegeben.

Class-Diagramm Strategy-Pattern

Der 'Witz' des Patterns besteht darin, dass in class Strategy das jeweilige Betriebssystem abgefragt und dann dementsprechend ein Objekt der hierfür speziell ausgelegten Klasse erzeugt wird. Hierin ließen sich natürlich beliebige weitere auf das jeweilige OS angepasste Algorithmen formulieren.

public class Strategy {

    public ClassSelector getInstance() {
        final boolean isWin = System.getProperty("os.name").startsWith(
                "Windows");
        final boolean isMac = System.getProperty("os.name").startsWith("Mac");
        final boolean isLinux = System.getProperty("os.name").startsWith(
                "Linux");

        if (isWin) {
            return new WinImpl();
        } else if (isMac) {
            return new MacImpl();
        } else if (isLinux) {
            return new LinuxImpl();
        } else {
            System.out.println("OS nicht feststellbar");
        }
        return null;
    }

    public static void main(String[] args) {
        Strategy str = new Strategy();
        ClassSelector inter = str.getInstance();
        inter.printOS();
    }
}

class WinImpl implements ClassSelector {
    public void printOS() {
        System.out.println("Windows");
    }
}

class MacImpl implements ClassSelector {
    public void printOS() {
        System.out.println("Mac OS X");
    }
}

class LinuxImpl implements ClassSelector {
    public void printOS() {
        System.out.println("Linux");
    }
}

interface ClassSelector {
    public void printOS();
}