1. Общ преглед
В тази статия ще обсъдим дизайна на абстрактния завод.
Книгата Design Patterns: Elements of Reusable Object-Oriented Software гласи, че Abstract Factory „предоставя интерфейс за създаване на семейства от свързани или зависими обекти, без да се посочват техните конкретни класове“. С други думи, този модел ни позволява да създаваме обекти, които следват общ модел.
Пример за шаблона за дизайн на абстрактна фабрика в JDK е newInstance () на класа javax.xml.parsers.DocumentBuilderFactory .
2. Пример за шаблон на абстрактния фабричен дизайн
В този пример ще създадем две реализации на модела за проектиране на фабрични методи: AnimalFactory и Color Factory.
След това ще управляваме достъпа до тях, използвайки Abstract Factory AbstractFactory:

Първо, ще създадем семейство от клас Animal и по-късно ще го използваме в нашата Фабрика за абстрактни.
Ето интерфейса Animal :
public interface Animal { String getAnimal(); String makeSound(); }
и конкретна патица за изпълнение :
public class Duck implements Animal { @Override public String getAnimal() { return "Duck"; } @Override public String makeSound() { return "Squeks"; } }
Освен това можем да създадем по-конкретни реализации на интерфейса на Animal (като Dog, Bear и т.н.) точно по този начин.
Абстрактната фабрика се занимава със семейства зависими обекти. Имайки това предвид, ще представим още един семеен цвят като интерфейс с няколко изпълнения ( бяло, кафяво, ... ).
Засега ще пропуснем действителния код, но той може да бъде намерен тук.
Сега, когато сме подготвили множество семейства, можем да създадем за тях интерфейс AbstractFactory :
public interface AbstractFactory { T create(String animalType) ; }
След това ще приложим AnimalFactory, използвайки модела за проектиране на фабричен метод, който обсъдихме в предишния раздел:
public class AnimalFactory implements AbstractFactory { @Override public Animal create(String animalType) { if ("Dog".equalsIgnoreCase(animalType)) { return new Dog(); } else if ("Duck".equalsIgnoreCase(animalType)) { return new Duck(); } return null; } }
По същия начин можем да внедрим фабрика за цветовия интерфейс, използвайки същия дизайн.
Когато всичко това е настроено, ще създадем клас FactoryProvider, който ще ни предостави изпълнение на AnimalFactory или ColorFactory в зависимост от аргумента, който предоставяме на метода getFactory () :
public class FactoryProvider { public static AbstractFactory getFactory(String choice){ if("Animal".equalsIgnoreCase(choice)){ return new AnimalFactory(); } else if("Color".equalsIgnoreCase(choice)){ return new ColorFactory(); } return null; } }
3. Кога да използвате абстрактния фабричен модел:
- Клиентът е независим от начина, по който създаваме и композираме обектите в системата
- Системата се състои от множество семейства обекти и тези семейства са проектирани да се използват заедно
- Нуждаем се от стойност на времето за изпълнение, за да изградим определена зависимост
Въпреки че моделът е страхотен при създаване на предварително дефинирани обекти, добавянето на новите може да е предизвикателство . За поддръжка на новия тип обекти ще е необходима промяна на класа AbstractFactory и всички негови подкласове.
4. Обобщение
В тази статия научихме за модела за дизайн на абстрактната фабрика.
И накрая, както винаги, изпълнението на тези примери може да бъде намерено в GitHub.