рдЕрдореВрд░реНрдд
рдпрд╣ рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдкрд░ рдкреНрд░рдмреБрджреНрдз рддреАрд╕рд░рд╛ рд▓реЗрдЦ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрджреАрджрд╛ рддрдХрдиреАрдХреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ: рдХрд╛рд░рдЦрд╛рдиреЛрдВ,
рдХрд╛рд░рдЦрд╛рдиреЛрдВ , рдЕрдореВрд░реНрдд рдХрд╛рд░рдЦрд╛рдиреЛрдВ, рдмрд┐рд▓реНрдбрд░реЛрдВ, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк, рдорд▓реНрдЯреАрдЯреЛрди, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд▓рдВрдм рдореЗрдВ рджреЗрд░реА, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкрд┐рдВрдкрд▓ рдореБрд╣рд╛рд╡рд░реЗ рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ "рдкреБрд▓" рдкрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕реНрдкрд░реНрд╢ред
рдкрд╣рд▓реЗ [1] рдФрд░
рджреВрд╕рд░реЗ [2] рд▓реЗрдЦреЛрдВ рдореЗрдВ рдПрдХрд▓ рдЧреАрддреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдЕрдХреНрд╕рд░ рдЕрдиреНрдп рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдЧреНрд▓реЗрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд░рд┐рдЪрдп
рдХрдИ рдиреЗ рд╢рд╛рдпрдж рдЬреЗрдирд░рд┐рдХ
рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдкрдврд╝рд╛ рдпрд╛ рд╕реБрдирд╛
[4] ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмреЗрд╢рдХ, рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрдЯрд░реНрди рдХреЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдЗрди рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдорд╛рди рдореЗрдВ, рдЕрд░реНрдерд╛рддреН рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╡рд┐рдорд╛рди рдореЗрдВ рд╣реИред
рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрдИ, рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рд░ рдЬрдЧрд╣ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рд▓реЗрдЦ рдХреЛрдб рдореЗрдВ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЙрдЪрд┐рдд рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдЬрдм рд╡реЗ рдХреЛрдб рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЬрдХрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рдРрд╕рд╛ рдЕрдХрд▓реНрдкрдиреАрдп рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рди рддреЛ рдПрдХ рдкрд░реА рдХрдерд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рди рд╣реА рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд▓рдо рдХреЗ рд╕рд╛рдеред рдореИрдВрдиреЗ рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрд╡рддрд╛рд░ рджреЗрдЦреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдореИрдВ рдЦреБрдж рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВ: рд▓реЗрдЦрдХ рдиреЗ рдХреНрдпрд╛ рдзреВрдореНрд░рдкрд╛рди рдХрд┐рдпрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ [3] рд╕реЗ рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдпрд╛
рдХрд╛рд░рдЦрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рд▓реЗрдВ ред рдореИрдВ рд╕рднреА рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:
const size_t count = 2;
рдпрджрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рддреБрд░рдВрдд рдирд┐рдореНрди рдЯрд┐рдкреНрдкрдгреА рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ:
- рдореБрдЭреЗ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдореБрдЭреЗ 0 рдпрд╛ 1 рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╡реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВред
- рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рд▓реВрдк рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЬреНрдЮрд╛рди рд╣реИ рдХрд┐ рдпреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИрдВ? рдЕрдЧрд░ рдореИрдВ рдлреИрдХреНрдЯреНрд░рд┐рдпреЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рд╡рд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЙрдирдХреА рдЬрд░реВрд░рдд рдХреНрдпреЛрдВ рд╣реИ? рдЖрдк рдмрд╕ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдпрд╛ рдПрдХ рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдм рдХреБрдЫ рдХрд░реЗрдЧрд╛ред
- рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдирдП рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддреБрд░рдВрдд рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдФрд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИред
рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдПрдХ рддрд░рд╣ рдХрд╛ рдЪрд┐рддреНрд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рджреЛрд╖ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
"рддрдм рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?", рдЪреМрдХрд╕ рдкрд╛рдардХ рдкреВрдЫреЗрдЧрд╛ред рдиреАрдЪреЗ рдЙрдкрдпреЛрдЧ рдХреЛрдб рд╣реИред рдпрд╣ рд╕реВрдЪреА рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ:
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди" рдореЗрдВ рдХрд╛рд░рдЦрд╛рдиреЗ рдЖрдорддреМрд░ рдкрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реЛрддреЗ рд╣реИрдВред рдЖрдк рдпрд╣ рднреА рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдХрд╛рди рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдкреИрдЯрд░реНрди рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣рддреЗ рд╣реИрдВред рдмрд╛рдж рдХреЗ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдпрд╣ рдПрдХ рдЕрдкреНрд░рд┐рдп рдкрдХреНрд╖ рд╕реЗ рдЦреБрдж рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдЧрд╛ред рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╕рдордп рдЕрдХреНрд╕рд░ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕рднреА рдкреБрд╕реНрддрдХреЛрдВ рдореЗрдВ рдкрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдб рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдм рдХреБрдЫ createObject рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдЖрдкрдХреЛ рдЕрдВрдд рдореЗрдВ рдбрд┐рд▓реАрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдпрд╣ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ рдпрд╛ рдирд╣реАрдВ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЕрдЧрд░ рдирд╣реАрдВ? рдлрд┐рд░, рдЬреАрд╡рди рднрд░ рдХреЗ рд╕рд╛рде рд╕рд╡рд╛рд▓ рдЙрдарддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╕рд╣реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╡рд╛рд▓реЗ рдРрд╕реЗ рдХреЛрдб рдХреЗ рдХрд╛рд░рдг рд╕рдлрд╛рдИ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред
рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореИрдВ рдПрдХ рдПрдХреАрдХреГрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдЙрддреНрдкрдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рд▓ рдзрд╛рдЧреЗ рдХреЗ рд╕рд╛рде рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХрдИ рд╣реИрдВред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА
рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
[7] ред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдореВрд░реНрдд, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдкрдпреЛрдЧ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдкрд░рд┐рдЪрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдирд┐рдпрдВрддреНрд░рдг рдЙрд▓рдЯрд╛ [8] ред рдпрд╣ рдЙрд╕ рдХреЛрдб рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╕реЗ рдЕрдореВрд░реНрдд рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдмрд╕ рд╕рдорд░реНрдкрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рднреА рджреЗрдЦрднрд╛рд▓ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ рд╕рднреА рдЬреНрдЮрд╛рдд рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ, рд╕рд╛рде рд╣реА рдПрдХ рдЙрджрд╛рд╣рд░рдг рднреА рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ [2] рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдпрд╣ рд▓реЗрдЦ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ
рдСрдмреНрдЬреЗрдХреНрдЯ рдПрди рдФрд░ рдЙрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ
рджреВрд╕рд░реЗ рд▓реЗрдЦ [2] рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рд╡рд╣реА рдХреЛрдб рджреВрдВрдЧрд╛ рдЬреЛ рдмрд╛рдж рдХреЗ рдиреИрд░реЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП,
рдкрд┐рдЫрд▓рд╛ рд▓реЗрдЦ рджреЗрдЦреЗрдВ [2] ред
template<typename T> struct An { template<typename U> friend struct An; An() {} template<typename U> An(const An<U>& a) : data(a.data) {} template<typename U> An(An<U>&& a) : data(std::move(a.data)) {} T* operator->() { return get0(); } const T* operator->() const { return get0(); } bool isEmpty() const { return !data; } void clear() { data.reset(); } void init() { if (!data) reinit(); } void reinit() { anFill(*this); } T& create() { return create<T>(); } template<typename U> U& create() { U* u = new U; data.reset(u); return *u; } template<typename U> void produce(U&& u) { anProduce(*this, u); } template<typename U> void copy(const An<U>& a) { data.reset(new U(*a.data)); } private: T* get0() const { const_cast<An*>(this)->init(); return data.get(); } std::shared_ptr<T> data; }; template<typename T> void anFill(An<T>& a) { throw std::runtime_error(std::string("Cannot find implementation for interface: ") + typeid(T).name()); } template<typename T> struct AnAutoCreate : An<T> { AnAutoCreate() { create(); } }; template<typename T> T& single() { static T t; return t; } template<typename T> An<T> anSingle() { return single<AnAutoCreate<T>>(); } #define PROTO_IFACE(D_iface, D_an) \ template<> void anFill<D_iface>(An<D_iface>& D_an) #define DECLARE_IMPL(D_iface) \ PROTO_IFACE(D_iface, a); #define BIND_TO_IMPL(D_iface, D_impl) \ PROTO_IFACE(D_iface, a) { a.create<D_impl>(); } #define BIND_TO_SELF(D_impl) \ BIND_TO_IMPL(D_impl, D_impl) #define BIND_TO_IMPL_SINGLE(D_iface, D_impl) \ PROTO_IFACE(D_iface, a) { a = anSingle<D_impl>(); } #define BIND_TO_SELF_SINGLE(D_impl) \ BIND_TO_IMPL_SINGLE(D_impl, D_impl) #define BIND_TO_IFACE(D_iface, D_ifaceFrom) \ PROTO_IFACE(D_iface, a) { anFill<D_ifaceFrom>(a); } #define BIND_TO_PROTOTYPE(D_iface, D_prototype) \ PROTO_IFACE(D_iface, a) { a.copy(anSingle<D_prototype>()); }
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ "рд╕реНрдорд╛рд░реНрдЯ" рдкреЙрдЗрдВрдЯрд░ рд╣реИ, рдЬреЛ рдПрдлрд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, aProduce рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдкрд░ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкреБрд▓ рдХрд╛ рдЦрд╛рдХрд╛
рдЖрдЗрдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ: рдСрдмреНрдЬреЗрдХреНрдЯ рдбреЗрдЯрд╛ рдЫрд┐рдкрд╛рдПрдВ, рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдбреЗрдЯрд╛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ, рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЛ "рдкреБрд▓" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд┐рдореНрдкрд▓ рдореБрд╣рд╛рд╡рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо IObject рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рди рд▓рд┐рдЦреЗрдВред рдЕрдЧрд▓рд╛, рд╣рдо рдмрд╕ рдЕрдкрдиреЗ IObject рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдХреНрд▓рд╛рд╕) рдХреЛ рд╡рд╛рд░рд┐рд╕ рдХрд░рддреЗ рд╣реИрдВред IFFT рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рдЧреЗрдЯрдиреЗрдо () рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдкреВрд░реА рдШреЛрд╖рдгрд╛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реЛрддреА рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣рдо рдЕрдкрдиреЗ getName () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрд╛рдВрдзрддреЗ рд╣реИрдВред рдСрд░реЗрдВрдЬ рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ:
An<IFruit> f; std::cout << "Name: " << f->getName() << std::endl;
рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд╣реБрдВрдЪ рдкрд░, рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реАрдкреАрдкреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреАрд╡рдирдХрд╛рд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░, рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдлреИрдХреНрдЯрд░реА рдЯреЗрдореНрдкрд▓реЗрдЯ
рдЕрдм рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд┐рдзрд┐ рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ред рдпрд╣рд╛рдВ рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ред рдореИрдВ рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБред
рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрджреГрд╢реНрдп рд░рд╣рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рд╣реЛрдЧрд╛ред рд▓реЗрдЦ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рдЪреАрд▓реЗрдкрди рдФрд░ рддрд╛рдХрдд рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ: рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдХ рдЙрддреНрдкрд╛рджрдХ рдХрд╛рд░реНрдп, рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдХрдИ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд╕рдордЭ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдЬрдЧрд╣ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдирдП c ++ 0x рдорд╛рдирдХ рд╕реЗ рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ msvc рдФрд░ icc рд╕рдВрдХрд▓рдХ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЕрднреА рддрдХ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рддреЛ, рд╣рдо рдлрд▓реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, IFFT рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
enum FruitType { FT_ORANGE, FT_APPLE };
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ Apple рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдПрдХ рдЙрддреНрдкрд╛рджрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдПрдБ:
void anProduce(An<IFruit>& a, FruitType type) { switch (type) { case FT_ORANGE: a.create<Orange>(); break; case FT_APPLE: a.create<Apple>(); break; default: throw std::runtime_error("Unknown fruit type"); } }
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдХ :: рдЙрддреНрдкрд╛рджрди рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
An<IFruit> f; f.produce(FT_ORANGE); std::cout << f->getName() << std::endl; f.produce(FT_APPLE); std::cout << f->getName() << std::endl;
рдЧреИрд░-рд░рдирдЯрд╛рдЗрдо рдорд╛рдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдХрд┐рд╕реА рднреА рд╕рдордп рдореЗрдВ, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рддрдм рдЖрдк рдЕрдиреНрдп, рд╕рд░рд▓ рддрд░реАрдХреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдордзреНрдпрд╡рд░реНрддреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдирд╛ рд╣реИ - рдЯреИрдЧ:
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдирд╛ рдФрд░ "рдмреНрд░рд┐рдЬ" рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:
рдмрд┐рд▓реНрдбрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ
рдХрдИ (рд╕реНрд╡рдпрдВ рд╕рд╣рд┐рдд) рд╣реИрд░рд╛рди рд╣реИрдВ, рдЬрдм рдХреЛрдИ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рд╕рдорд╛рди рдкреИрдЯрд░реНрди рд╣реИрдВред рдлрд┐рд░ рд╡реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ?
рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рднреЗрдж рдХрд░рддрд╛ рд╣реВрдВ: рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рдХрд╛рд░ рдЬреНрдЮрд╛рдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рднрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╛рдиреА рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ, рдмрд┐рд▓реНрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреНрд░реВрдЯ рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬреЛ рдЕрдм рд╕рд╛рд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рдЧреЗрдЯрдирд╛рдо () рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рддреА рд╣реИред рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдХрд╛рд░реНрдп рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рднрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, 2 рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдбрд┐рдЬрд╛рдЗрдирд░ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рд╣реА рдорд╛рди рд╕реЗ рднрд░рддреЗ рд╣реИрдВред рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп aProduce рд╡рд╛рдВрдЫрд┐рдд рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
An<Fruit> f; f.produce(FT_ORANGE); std::cout << f->getName() << std::endl; f.produce(FT_APPLE); std::cout << f->getName() << std::endl;
рд╕рд╛рд░ рдлреИрдХреНрдЯрд░реА рдЯреЗрдореНрдкрд▓реЗрдЯ
рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдмрдВрдз рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ GUI рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
struct IWindow : IObject { virtual std::string getWindowName() = 0; }; struct IButton : IObject { virtual std::string getButtonName() = 0; };
рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, gtk рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВ:
struct IWindowsManager : IObject { virtual void produceWindow(An<IWindow>& a) = 0; virtual void produceButton(An<IButton>& a) = 0; };
рдЕрдм рдШреЛрд╖рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
struct GtkWindow : IWindow { virtual std::string getWindowName() { return "GtkWindow"; } }; struct GtkButton : IButton { virtual std::string getButtonName() { return "GtkButton"; } }; struct GtkWindowsManager : IWindowsManager { virtual void produceWindow(An<IWindow>& a) { a.create<GtkWindow>(); } virtual void produceButton(An<IButton>& a) { a.create<GtkButton>(); } }; BIND_TO_IMPL_SINGLE(IWindowsManager, GtkWindowsManager)
рдФрд░ рдЙрддреНрдкрд╛рджрди рдХрд╛рд░реНрдп рдмрдирд╛рдПрдБ:
PROTO_IFACE(IWindow, a) { An<IWindowsManager> pwm; pwm->produceWindow(a); } PROTO_IFACE(IButton, a) { An<IWindowsManager> pwm; pwm->produceButton(a); }
рдЕрдм рдЖрдк рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
An<IButton> b; std::cout << b->getWindowName() << std::endl; An<IWindow> w; std::cout << w->getButtonName() << std::endl;
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
enum ManagerType { MT_GTK, MT_UNKNOWN };
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЯреЗрдореНрдкрд▓реЗрдЯ
рдпрд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд▓реЛрди рдХрд░рдХреЗ рдЬрдЯрд┐рд▓ рдпрд╛ "рднрд╛рд░реА" рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдХреНрд╕рд░ рдЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рдВрдЧрд▓рдЯрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдХреНрд▓реЛрди рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░ рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдФрд░ рднрд╛рд░реА рд╡рд░реНрдЧ рдХреЗ рдкрд░рд┐рд╕рд░ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ ProtoComplexObject рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдХрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
#define BIND_TO_PROTOTYPE(D_iface, D_prototype) \ PROTO_IFACE(D_iface, a) { a.copy(anSingle<D_prototype>()); }
рдЕрдм рдЖрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
An<ComplexObject> o; std::cout << o->name << std::endl;
рдорд▓реНрдЯреАрдЯрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░рдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░реЛрдВ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХрд▓ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдерд╛, рддреЛ рд╣рдо рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢ / рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рд╕рдорд╛рди рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░ рд╣реИрдВ рдФрд░ рд╣рдо рдЙрдирдХреЗ рдмреАрдЪ рд▓реЛрдб рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рджреЛрдиреЛрдВ рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдпрд╣рд╛рдВ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдорд▓реНрдЯреАрдЯрди рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд╕рд░рд▓рддрдо рдХрдиреЗрдХреНрд╢рди рдмреИрд▓реЗрдВрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдирдП рдЕрдиреБрд░реЛрдз рдХреЛ рдЕрдЧрд▓реЗ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: 2 рдХрдиреЗрдХреНрд╢рди рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдирдП рдХрдиреЗрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╡реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рд╕рд┐рдВрдЧрд▓рдЯрди, рдлреИрдХреНрдЯрд░реА рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк
рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреЗ рддрд╛рд▓рдореЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкрд╛рд░рд┐рдд рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрдирд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рддред рд╣рдо рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдлреА рднрд╛рд░реА рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП "рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк" рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдЖрд▓рд╕реА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рддред рдЬрдм рддрдХ рдЙрдирдХреА рдЬрд░реВрд░рдд рди рд╣реЛ, рддрдм рддрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рди рдмрдирд╛рдПрдВред рдПрдХ рдореМрдХрд╛ рдпрд╣ рднреА рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рд╣рдо рдПрдХ "рдЖрд▓рд╕реА" рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдПрдВрдЧреЗред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрдирд╛рдПрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
struct IShape : IObject { virtual std::string getShapeName() = 0; virtual int getLeftBoundary() = 0; }; struct Square : IShape { Square() { std::cout << "Square ctor" << std::endl; } Square(const Square& s) { std::cout << "Square copy ctor" << std::endl; } virtual std::string getShapeName() { return "Square"; } virtual int getLeftBoundary() { return m_x; } private:
рдореИрдВрдиреЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕рдмрдХреБрдЫ "рдмрдбрд╝рд╛ рд╣реЛрдиреЗ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП, рд╣рдо unordered_map рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдпрд╛ рддреЛ рдмреВрд╕реНрдЯ рдореЗрдВ рдпрд╛ std рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдкрдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдирдП рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдХреБрдВрдЬреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдЧреА, рдФрд░ рдорд╛рди рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреБрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдПрдБ:
рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рднрд╛рд░реА рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдлрд┐рд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рд╣рдо рдПрдВрдХреНрд▓реЙрд░реНрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
struct ShapeFactory { ShapeFactory() { std::cout << "ShareFactory ctor" << std::endl;
рддреЛ, рдХрд╛рд░рдЦрд╛рдирд╛ рддреИрдпрд╛рд░ рд╣реИред рдЕрдм рд╕рд╛рдВрд╕ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: void anProduce(An<IShape>& a, const std::string& type) { An<ShapeFactory> factory; factory->produce(a, type); }
рдЕрдм рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: std::cout << "Begin" << std::endl; An<IShape> shape; shape.produce("Square"); std::cout << "Name: " << shape->getShapeName() << std::endl; shape.produce("Circle"); std::cout << "Name: " << shape->getShapeName() << std::endl; shape.produce("Square"); std::cout << "Name: " << shape->getShapeName() << std::endl; shape.produce("Parallelogram"); std::cout << "Name: " << shape->getShapeName() << std::endl;
рд╕реНрдХреНрд░реАрди рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреНрдпрд╛ рджреЗрдЧрд╛: Begin ShareFactory ctor Square ctor Square copy ctor Name: Square Circle ctor Circle copy ctor Name: Circle Square copy ctor Name: Square Cannot clone the object for unknown type
рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╢реБрд░реБрдЖрдд рдХреЛ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрднреА рддрдХ рдХреЛрдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░рдЦрд╛рдиреЗ рдФрд░ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рдХрд┐ "рдЖрд▓рд╕реНрдп" рдХреА рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЙрд▓ред рдЖрдХреГрддрд┐ ("рд╕реНрдХреНрд╡рд╛рдпрд░") рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ: рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ (рд╢реЗрдпрд░рдлрд╝реЗрдХреНрдЯрд░ ctor) рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реНрдХреНрд╡рд╛рдпрд░ (рд╕реНрдХреНрд╡рд╛рдпрд░ ctor) рдХрд╛ рдЬрдиреНрдо рд╣реЛрддрд╛ рд╣реИ, рдлрд┐рд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ (рд╕реНрдХреНрд╡рд╛рдпрд░ ctor) рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред рдпрд╣ getShapeName () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдХреНрд╡рд╛рдпрд░ (рдирд╛рдо: рд╕реНрдХреНрд╡рд╛рдпрд░) рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕рд░реНрдХрд┐рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИ, рдХреЗрд╡рд▓ рдЕрдм рдХрд╛рд░рдЦрд╛рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк size.produce ("рд╕реНрдХреНрд╡рд╛рдпрд░") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрдХреНрд╡рд╛рдпрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЕрдм рдХреЗрд╡рд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рдХреЙрдкреА рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕реНрдХреНрд╡рд╛рдпрд░ рдХреЙрдкреА ctor)редрдЬрдм рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдЖрдХреГрддрд┐ рдЖрдХреГрддрд┐ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдкреГрд╖реНрдард╛рдВрдХрд┐рдд рдХрд░реЗрдВ ("Parallelogram"), рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓реЛрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛)редрдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рд▓реЗрдЦ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдРрд╕реЗ рдкреИрдЯрд░реНрди рдореЗрдВ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВ рдЬреНрдЮрд╛рдд рдореБрджреНрджреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрд░рдг рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ: рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд [7] ред рд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╣реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рдЦрд╛редрддреБрд▓рдирд╛ рддрд╛рд▓рд┐рдХрд╛: рдмрд┐рдирд╛ рд╢рд░реНрдд рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрдорд╛рдгрдЯреЗрдореНрдкрд▓реЗрдЯ | рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ | рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ |
---|
рдПрдХрд╛рдХреА рд╡рд╕реНрддреБ | T::getInstance() | An<T> -> |
рдкреБрд▓ | T::createInstance() | An<T> -> |
рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ | T::getInstance().create() | An<T> -> |
Multiton | T::getInstance(instanceId) | An<T> -> |
рддреБрд▓рдирд╛ рддрд╛рд▓рд┐рдХрд╛: рдЗрдирдкреБрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛рдЯреЗрдореНрдкрд▓реЗрдЯ | рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ | рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ |
---|
рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ | T::getInstance().create(...) | An<T>.produce(...) |
рд╕рд╛рд░ рдХрд╛рд░рдЦрд╛рдирд╛ | U::getManager().createT(...) | An<T>.produce(...) |
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк | T::getInstance().clone() | An<T>.produce(...) |
рд╕рд┐рдВрдЧрд▓рдЯрди, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдФрд░ рдлреИрдХреНрдЯрд░реА | T::getInstance().getPrototype(...).clone() | An<T>.produce(...) |
рд▓рд╛рдн рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛрдб рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рд╕реЗ рд╕рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╣рд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╣реБрдд рд▓рдЪреАрд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреБрдХреНрдд рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИредрдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
рдФрд░ рдлрд┐рд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рдЦреИрд░, рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдХрдИ рдореБрджреНрджреЛрдВ рдФрд░ рдЕрдиреНрдп рд░реЛрдЪрдХ рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп "рдмрдиреНрд╕" рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрд╕рд╛рд╣рд┐рддреНрдп
[рез] рд╣реИрдмреНрд░рд╣реНрдм: рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛[реи] рд╣реИрдмреНрд░реИрдм: рд╕рд┐рдВрдЧрд▓рдЯрди рдФрд░ рд╡рд╕реНрддреБ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓[рей] рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛: рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐[рек] рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛: рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдмрдирд╛рдирд╛[рел] рдПрдВрдбреНрд░реАред рдиреЗрдЯ: рдЬреЗрдирд░реЗрдЯрд┐рдВрдЧ рдкреИрдЯрд░реНрди[рем] рдПрдВрдбреНрд░реА рдСрди рдиреЗрдЯ : рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐[ Factory ] рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛: рдирд┐рд░реНрднрд░рддрд╛ рдЙрд▓рдЯрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд[ : ] рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛: рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╡рд┐рд▓реЛрдо