Абстрактни фабрични модели в Java

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.