2016-07-09 4 views
0

Я только начинал новый проект кодирования. Я могу опередить себя, но я застрял. Я хотел реализовать абстрактную фабрику для графического интерфейса пользователя, похожую на пример на Wikipedia. Однако у разных систем есть свои собственные параметры для создания окон. В настоящее время я пришел со следующими решениями моей дилеммы:Как реализовать абстрактную фабрику для оконных систем

  1. Создать тип, который изменяется в зависимости от директив компилятора
  2. Не использовать директивы компилятора и просто положить все, что в таком типе, который содержит все возможные данные член
  3. Создайте полиморфную иерархию и используйте динамическое кастинг внутри каждой оконной функции
  4. Используйте какой-то промежуточный синглтон, который содержит информацию. Это похоже на esp. бесполезно и, вероятно, также будет включать в себя кастинг.
  5. Используйте другой шаблон, например, строитель.

Наша цель - создать интерфейсы высокого уровня, которые являются однородными, так что создание окна и т. Д. Одинаково для всех платформ.

Я стесняюсь делать # 5 просто потому, что кажется, что это будет достаточно распространенной проблемой, что уже должно быть решение. Это всего лишь игрушка, так что это больше об учебе, чем о создании практического приложения. Я знаю, что могу использовать существующие базы кода, но это не достигло моей реальной цели.

Заранее спасибо.

+0

'Однако у разных систем есть свои собственные параметры для создания окон.« Было бы здорово, если бы вы могли привести конкретный пример этого. – Fuhrmanator

ответ

0

Я думаю, это зависит от ситуации. Но как насчет использования абстрактной фабрики с застройщиком (внутри фабрики) и декоратором с некоторыми значениями по умолчанию для компонентов GUI, где декоратор будет иметь один и тот же интерфейс для аналогичных компонентов из разных графических интерфейсов GUI и расширяет класс из библиотеки графического интерфейса.

0

После того, как я прочитал больше, я понял, что я могу использовать Dependency Injection для создания конкретной фабрики. Поскольку точка входа знает, какую фабрику она использует, она может быть передана клиенту. Я не могу поверить, что раньше этого не видел, но я не думаю, что Dependency Injection «нажали» до сих пор.

0

Я бы поставил системные параметры в конструкторе для каждой абстрактной фабрики.

public interface WindowFactory { 

public Window build(); 

} 

public class WindowsWindowFactory implements WindowFactory { 

private param1, param2, param3; 

public WindowsWindowFactory(param1,param2,param3) {} // set params 

public Window build() {} // use params 

} 

public class LinuxWindowFactory implements WindowFactory { 

private param1, param2; 

public LinuxWindowFactory(param1,param2) {} // set params 

public Window build() {} // use params 

}