interface Penyapa {
    String sapa(String nama);
}

class SapaFormal implements Penyapa {
    @Override
    public String sapa(String nama) {
        return "Selamat datang, " + nama;
    }
}

class SapaSantai implements Penyapa {
    @Override
    public String sapa(String nama) {
        return "Halo, " + nama + "!";
    }
}

public class PabrikPlugin {
    public static void main(String[] args) throws Exception {
        // daftar nama plugin datang dari luar: berkas konfigurasi, baris perintah, registry
        String[] namaPlugin = {"SapaFormal", "SapaSantai"};

        for (String nama : namaPlugin) {
            Class<?> c = Class.forName(nama);                       // muat class dari string
            Penyapa plugin = (Penyapa) c.getDeclaredConstructor()   // constructor tanpa argumen
                                         .newInstance();            // buat objeknya
            System.out.println(nama + " -> " + plugin.sapa("Budi"));
        }
    }
}
