Фабричный шаблон в целом исходит из мысли, что Создание объекта - важная вещь, и ее не следует разбрасывать по коду, а нужно делать из Централизованное расположение , чтобы иметь больший контроль;он также аккуратнее.
Заводской метод просто служит вышеуказанной цели
ControlFactory
{
public Button GetButton(){return new Button();}
public Label GetLabel(){return new Label();}
public TextBox GetTextBox(){return new TextBox();}
}
Тогда для создания экземпляров этих элементов управления вы будете писать под кодом
ControlFactory cf=new ControlFactory();
Button b=cf.GetButton();b.Text="Click Me";
Label l=cf.GetLabel();
Абстрактная фабрика , с другой стороны, полезна для работы с семействами объектов.Например: если вы планируете разные версии вашего программного обеспечения для бесплатных и платных пользователей, вы можете использовать обычные элементы управления для бесплатной версии и некоторые эстетически лучшие элементы управления для платной версии.Это может быть элегантно обработано с помощью Pattern Abstract Factory Pattern.
abstract class ControlsFactory
{
public abstract Button GetButton();
public abstract Label GetLabel();
}
--- теперь FreeControlFactory и ExoticControlFactory наследуют вышеприведенный класс
class FreeControlsFactory:ControlsFactory
{
public override Button GetButton()
{
return new FreeButton();//Assume that **FreeControl** and **ExoticControl** are Inherited From **Control**
}
public override Label GetLabel()
{
return new FreeLabel();
}
}
...
class ExoticControlsFactory : ControlsFactory
{
public override Button GetButton()
{
return new ExoticButton();
}
public override Label GetLabel()
{
return new ExoticLabel();
}
}
Предположим, что FreeControl и ExoticControl унаследованы от Control (я не пишу здесь код)
сейчасВы будете писать код ниже, чтобы переключить все элементы управления на другую версию
if (VersionKey=="FreeVersion")
{ControlFactory cf= new FreeControlFactory();}
ese if (VersionKey=="PaidVersion")
{cf=new ExoticControlFactory();}
на основе вышеуказанного выбора все места управления будут переключаться
Button b1=cf.GetButton();//b1 will be based on which family cf is containing
Button b2=cf.GetButton();
Button b3=cf.GetButton();
Label l1= cf.GetLabel();
Label l2= cf.GetLabel();
Это полиморфныйздесь помогает поведение, т. е. cf может содержать как произвольную, так и экзотическую часть.и это решает, какие элементы управления созданы.