2011-08-31 3 views
4

Внутри VB6 можно ли реализовать шаблон дизайна Singleton?VB6 Возможно ли реализовать шаблон дизайна Singleton?

В настоящее время унаследованная система, над которой я работаю, имеет большое количество операций ввода-вывода, выполняемых несколькими экземплярами определенного класса. Желательно очистить все эти экземпляры и выполнить IO только одним экземпляром. Это позволило бы нам добавить значимые протоколирования и мониторинга в процедуры ввода-вывода.

ответ

3

Существует так много способов сделать это, и это зависит от того, является ли это многопроектным приложением с разными DLL или одним проектом.

Если это один проект, и есть большое количество кода, который вы беспокоитесь о чейнинга/нарушение, то я предлагаю следующее:

  1. Учитывая класс clsIOProvider, который инстанцированный повсюду, создать модуль modIOProvider в том же проекте.
  2. Для каждого метода/свойства, определенного в clsIOProvider, создайте тот же набор методов в modIOProvider.
  3. Реализация этих методов, а также данных экземпляра класса, должна быть клонирована из clsIOProvider в modIOProvider.
  4. Все методы и свойства в clsIOProvider должны быть перенесены на реализацию в modIOProvider. Класс больше не должен иметь данные экземпляра.
  5. (необязательно) Если класс требует использования конструктора и деструктора (Initialize/Terminate), переадресуйте их в modIOProvider. Добавьте один счетчик instnace в modIOProvider для отслеживания количества экземпляров. Запустите код инициализации, когда счетчик экземпляров перейдет от 0 до 1, и ваш код завершения, когда счетчик экземпляров идет от 1 до 0.

Преимущество этого в том, что вам не нужно изменять коэффициент в десятки мест, которые используют класс clsIOProvider. Они счастливо не знают, что объект теперь эффективно синглтон.

Если кодирование проэкта с нуля я бы сделал это немного по-другому, но в качестве рефакторинга, который я изложил, должен хорошо работать.

+2

+1 для метода с минимальным воздействием на существующий код. Хотя вы могли бы (1,2) создать новый класс clsConcreteIOProvider, который реализует clsIOProvider. (3) Переместите все реализации из clsIOProvider в clsIOProvider (4) Измените все методы и свойства для перехода к частному экземпляру clsConcreteIOProvider. (5) В Class_Initialise задайте частный экземпляр clsConcreteIOProvider для одного экземпляра (singleton), используя технику из ответа Дины. Одно из преимуществ заключается в том, что вы можете рассчитывать на подсчет ссылок VB/COM, чтобы в случае необходимости вливать/завершать базовый синглтон. – MarkJ

+0

Да, это отличный альтернативный способ сделать это в том же духе, что и нулевой эффект на существующий код. – tcarvin

2

Достаточно просто создать и использовать только один экземпляр объекта. Как вы это делаете, это зависит от вашего кода от того, что он делает и от чего он вызван.

В одном процессе вы можете просто иметь одну переменную в глобальном модуле с экземпляром, возможно, с помощью заводской функции, которая создает его при первом использовании.

Если это совместное использование нескольких процессов, это усложняет ситуацию, но может быть выполнено с помощью ActiveX EXE и таблицы Running Object.

+0

+1 Глобальная переменная в модуле – MarkJ

+0

@MarkJ - Проблема с глобальной переменной заключается в том, что вам нужно добавить If Not modGlobal.IOObject is Nothing Then Set modGlobal.IOObject = Новый clsIOObject перед каждым его использованием. И прекращение объекта одинаково сложно (если требуется). – tcarvin

+2

Да, но вы можете использовать заводскую функцию, которая затем позволяет делать подсчет числа ссылок с помощью функции get и release. – Deanna

Смежные вопросы