2015-10-18 3 views
0

Предположим, у меня есть 2 класса: ValidatorA, ValidatorB, и оба имеют одно и то же объявление функции Validate: public void Validate(string input) (таким образом реализуя тот же интерфейс).Шаблон проектирования для создания определенного типа объекта

Как создать единую точку, которая получит имя , и отправить его соответствующему методу Validate, который он должен использовать? (В случае, если я не хочу использовать "переключатель-дело" ...)

Например:

Тип "Bla" следует активировать метод ValidatorA

Тип "Bla2" следует активировать метод ValidatorB

Тип "blÀ3" следует активировать метод ValidatorA

PS

Я думал об использовании словаря в классе, и инициализировать его в конструкторе, как:

Dictionary<string,IValidator> dic = new Dictionary<string,IValidator>(); 
dic["Bla"] = new ValidatorA(); 
dic["Bla2"] = new ValidatorB(); 
dic["Bla3"] = new ValidatorA(); 

Затем использовать:

общественности недействительным OnePoint (тип строки, строка ввода) { DIC [ тип] .validate (вход); }

Но этот способ позволяет мне только SINGLE экземпляр для типа.

+0

На каком языке вы хотите получить ответ? И, по крайней мере, для java, имена методов должны также использовать camlCase(). – GhostCat

+0

Почему вы думаете, что это позволяет вам только один экземпляр? –

+0

Что случилось с тем, что вы написали? В зависимости от типа будет инициирован правильный метод проверки (полиморфизм) – ehh

ответ

1

Для этого можно использовать шаблон Factory. Создайте базовый класс для классов Validator1 и Validator2, и в этом классе вы можете написать свой метод проверки. сделайте его виртуальным, чтобы вы могли переопределить этот метод в своих отдельных классах.

public class BaseClass 
{ 
    public virtual void Validate() 
    { 
     throw new exception("not implemented"); 
    } 
} 

public class Validate1 : BaseClass 
{ 
    public ovrerride void Validate() 
    { 
     // your validation code 
    } 
} 

public class Validate2 : BaseClass 
{ 
    public ovrerride void Validate() 
    { 
     // your validation code 
    } 
} 

Сделать другой класс Factory для создания отдельных объектов.

public static class Factory() 
{ 
     public static BaseClass CreateObject() 
     { 
      // create your validate1 and validate2 objects in here. use if or switch-case according to your requirement. 
      return validate1 or validate2 
     } 
} 

Вы можете позвонить на заводский класс и создать объект Validate1 или Validate2 в качестве своего требования.

BaseClass validateObject = FacctoryClass.CreateObject();

и вы можете вызвать отдельные методы проверки с помощью этого экземпляра.

ex: validateObject.Validate();

надеюсь, что это может быть помощь для вас ...

+0

PS: Я не разработчик Java. я делаю .net – user2837480

+0

Я не хотел использовать «if» или «switch-case» ... – ohadinho

+0

@ohadinho это только для создания соответствующего объекта. это не обязательно, если вы можете создавать объекты класса отдельно. – user2837480

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