Если я работаю над API для рисования фигур, я могу захотеть использовать DirectX или графические вызовы, или OpenGL. Итак, я создам интерфейс, который абстрагирует мою реализацию от того, что вы называете.
Итак, вы вызываете фабричный метод: MyInterface i = MyGraphics.getInstance()
. Затем у вас есть контракт, и вы знаете, какие функции вы можете ожидать в MyInterface
. Таким образом, вы можете вызвать i.drawRectangle
или i.drawCube
и знать, что если вы меняете одну библиотеку на другую, функции поддерживаются.
Это становится более важным, если вы используете Dependency Injection, так как в XML-файле вы можете заменить реализации.
Итак, у вас может быть одна криптографическая библиотека, которую можно экспортировать для общего пользования, и другая, предназначенная для продажи только американским компаниям, и разница в том, что вы изменяете файл конфигурации и остальную часть программы. не изменено.
Это широко используется в коллекциях в .NET, так как вы должны просто использовать, например, List
переменные, и не волнуйтесь, был ли это ArrayList или LinkedList.
Пока вы кодируете интерфейс, разработчик может изменять фактическую реализацию, а остальная часть программы остается неизменной.
Это также полезно при модульном тестировании, так как вы можете макетировать целые интерфейсы, поэтому мне не нужно переходить к базе данных, а нужно использовать макетную реализацию, которая просто возвращает статические данные, чтобы я мог протестировать свой метод не беспокоясь, не работает ли база данных для обслуживания или нет.