рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд╛рд╡рд╛ (рдФрд░ рди рдХреЗрд╡рд▓) рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЖрдЬ рдХреЛрдб рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ
рдЬрд╛рджреБрдИ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреИрд╢рдиреЗрдмрд▓
рдврд╛рдВрдЪреЗ рдпрд╛ рдЖрдИрдУрд╕реА рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрд╡реЗрджрди рдХрд┐рд╕реА рднреА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓рд╛ рдФрд░ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ?
рдЙрд╕ рдЕрдВрддрд┐рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рдЙрд╕ рд╕рдордп рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдПрд╕рдкреАрдЖрдИ
рдмрд╛рдЗрдХ рддрдВрддреНрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ
META-INF / рд╕реЗрд╡рд╛рдУрдВ / <рдпреЛрдЧреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо> рдХреЗ рд▓рд┐рдП рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рджрд┐рдЦрддрд╛ рдерд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдЧ рдХрд╛
рдирд╛рдо рд▓реЗрддрд╛ рдерд╛ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐
рд╕рд░реНрд╡рд┐рд╕ рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдЗрдВрдЯрд░рдлреЗрд╕ (SPI) рдкреНрд▓рдЧ-рдЗрди рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореИрдХреЗрдирд┐рдЬреНрдо рд╣реИ рдФрд░
рдЬрд╛рд╡рд╛ рд░рдирдЯрд╛рдЗрдо рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ (JRE) рдореЗрдВ рдЗрд╕ рдореИрдХреЗрдирд┐рдЬреНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдЬрд╛рд╡рд╛ рдбрд╛рдЯрд╛рдмреЗрд╕ рдбрд╛рдЯрд╛рдмреЗрд╕ (JDBC) рдореЗрдВ :
ps = Service.providers(java.sql.Driver.class); try { while (ps.hasNext()) { ps.next(); } } catch (Throwable t) {
рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЕрдм
Class.forName (<рдбреНрд░рд╛рдЗрд╡рд░ рд╡рд░реНрдЧ>) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ), JDBC рдбреНрд░рд╛рдЗрд╡рд░ рдкрд╣рд▓реА рдмрд╛рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдЬрдм рд╡реЗ
DriverManager рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
SPI рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ
рдЬрд╛рд╡рд╛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди (JCE) ,
рдЬрд╛рд╡рд╛ рдирд╛рдордХрд░рдг рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗрд╡рд╛ (JNDI) ,
XML рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдПрдкреАрдЖрдИ (JAXP) ,
рдЬрд╛рд╡рд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдПрдХреАрдХрд░рдг (JBI) , рдЬрд╛рд╡рд╛ рдзреНрд╡рдирд┐, рдЬрд╛рд╡рд╛ рдЫрд╡рд┐ I / O рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдкреВрд░реЗ рдмрд┐рдВрджреБ рд╕реЗрд╡рд╛ (рд╕реЗрд╡рд╛) рдФрд░ рдкреНрд░рджрд╛рддрд╛рдУрдВ (рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛рдУрдВ) рдореЗрдВ рддрд░реНрдХ рдХрд╛ рдЕрд▓рдЧрд╛рд╡ рд╣реИред рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдВрдХ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ (UTF-8)
META-INF / рд╕реЗрд╡рд╛рдУрдВ / <рдпреЛрдЧреНрдп рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ> рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдЬрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкреНрд░рджрд╛рддрд╛ рд╡рд░реНрдЧ рдХрд╛ рдкреВрд░рд╛ рдирд╛рдо рд╣реИред рд░рд┐рдХреНрдд рд▓рд╛рдЗрдиреЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ (# рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ) рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рджрд╛рддрд╛рдУрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз: рдЙрдиреНрд╣реЗрдВ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ (рд╢реВрдиреНрдп-рддрд░реНрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди
java.util.ServiceLoader рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЬрд╛рд╡рд╛ рдПрд╕рдИ 6 рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рдХрд╕реНрдЯрдо рдХреЛрдб рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЛрдбрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╢ рдореЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИред рдХреИрд╢ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдирд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред
рдЬрд╛рд╡рд╛ рдПрд╕рдИ рдХреЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ,
sun.misc.Service , рдЬреЛ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
рд╕рди рдУрд░реЗрдХрд▓ рдХреЗ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЬрд╛рд╡рд╛ рдПрд╕рдИ рд░рд┐рд▓реАрдЬ рдореЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕рдВрдЧреАрдд рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдирд╛рдо рджреНрд╡рд╛рд░рд╛ рдЫрд╛рдБрдЯреЗ рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
public class MusicFinder { public static List<String> getMusic() {
рдХрд┐рд╕реА рд╕рдордп рдореЗрдВ, рд╣рдордиреЗ рд╕рдорд╛рдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреВрд░реНрдг рдорд╣рддреНрд╡ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рджреЛрд╕реНрддреЛрдВ рдиреЗ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдХреБрдЫ рдЧрд╛рдпрдм рдерд╛ред рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕ рд╕рднреА рд╢рд╛рдВрдд рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдХреЛрдИ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдПрд╕рдкреАрдЖрдИ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╕реБрдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдПрдВ:
public class FileReportRenderer extends ReportRenderer { @Override public void generateReport() { final List<String> music = findMusic(); try { final FileWriter writer = new FileWriter("music.txt"); for (String composition : music) { writer.append(composition); writer.append("\n"); } writer.flush(); } catch (IOException e) { e.printStackTrace(); } } }
рдореЗрдЯрд╛- рдЗрди
/ рд╕реЗрд╡рд╛рдУрдВ / com.example.ReportRenderer рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд
рдбрд╛рд▓реЗрдВ :
com.example.FileReportRenderer
рд╕реНрд░реЛрдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ:
public class ReportRenderer {
рд▓реЙрдиреНрдЪ рдХреЗ рд╕рдордп, рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╕реНрдХреНрд░реАрди рдкрд░ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдВрдЧреАрдд рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдирдП рдмрдирд╛рдП рдЧрдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬрд╛рд░ рдХреЛ
рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ , рддреЛ рд╣рдо рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╡рд╛рд▓реЗ рдПрдХ рдореНрдпреВрдЬрд╝рд┐рдХ.рдЯреИрдХреНрд╕
рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
рдЕрдм
MusicFinder рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЪрд▓рд┐рдП рдЗрд╕реЗ рднреА рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдмрджрд▓реЗрдВ:
public interface MusicFinder { List<String> getMusic(); }
рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ:
public class DummyMusicFinder implements MusicFinder { public List<String> getMusic() { return Collections.singletonList("From DummyMusicFinder..."); } }
ReportRenderer рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕рдорд░реНрдерди:
public class ReportRenderer {
ReportRenderer рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
, рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓
META-INF / рд╕реЗрд╡рд╛рдПрдВ / com.example.MusicFinder рдЬреЛрдбрд╝реЗрдВ , рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
com.example.DummyMusicFinder
рдлрд┐рд░ рд╕реЗ, рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдЕрдм рд╡рд┐рд╕реНрддрд╛рд░ред рдпрд╣рд╛рдВ рд╣рдо
MusicFinder рдХреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХрд░реЗрдВрдЧреЗ :
public class ExtendedMusicFinder implements MusicFinder { public List<String> getMusic() { return Collections.singletonList("From ExtendedMusicFinder..."); } } public class MyMusicFinder implements MusicFinder { public List<String> getMusic() { return Collections.singletonList("From MyMusicFinder..."); } }
рдореЗрдЯрд╛- INF / рд╕реЗрд╡рд╛ / com.example.MusicFinder :
com.example.MyMusicFinder
com.example.ExtendedMusicFinder
рдЦреИрд░, рдпрд╣ рд╕рдм, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм
рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕реВрдЪреА рджреЗрдЧрд╛:
DummyMusicFinder рд╕реЗ ...
ExtendedMusicFinder рд╕реЗ ...
MyMusicFinder рд╕реЗ ...
рдирдореВрдирд╛ рд╕реНрд░реЛрдд
рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ
рд╣реИрдВ ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдХрджрдо рд╕рд╣реА рд╣реИ, рдФрд░ рдореИрдВ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╕рдВрдЧреАрдд рдЦреЛрдЬ рдЗрдВрдЬрди рдХреЗ рд▓реЗрдЦрдХ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред рдореИрдВ рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рдХрдЯреНрдЯрд░рдкрдВрдереА рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рднреА рдлреЛрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ IoC рдХрдВрдЯреЗрдирд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдорд╛рдирддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕рд╛рд╣рд┐рддреНрдп
рдкреНрд▓рдЧрдЗрдирд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕: рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛рд╕реЗрд╡рд╛ рднрд╛рд░ рдХрд░рдиреЗрд╡рд╛рд▓рд╛