• Паттерн фабричного метода — это порождающий паттерн, который широко используется в JDK, а также в фреймворках Spring и Struts.
  • Паттерн фабричного метода основан на «входных данных» и применяется между суперклассом и несколькими подклассами; этот паттерн переносит ответственность за создание объектов на фабричный класс.
  • Сначала давайте разберёмся, как применять паттерн фабричного метода в Java, и поймём его преимущества. Кроме того, паттерн фабричного метода также широко используется в JDK.
  • Суперкласс может быть интерфейсом, абстрактным классом или родительским классом. В этом примере мы объясним паттерн фабричного метода через переопределение метода toString().

Пример

package com.journaldev.design.model; public abstract class Computer { public abstract String getRAM(); public abstract String getHDD(); public abstract String getCPU(); @Override public String toString(){ return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU(); } }

Подклассы шаблона проектирования Factory

Предположим, подклассы PC и Server реализуют Computer:

Пример

package com.journaldev.design.model; public class PC extends Computer { private String ram; private String hdd; private String cpu; public PC(String ram, String hdd, String cpu){ this.ram=ram; this.hdd=hdd; this.cpu=cpu; } @Override public String getRAM() { return this.ram; } @Override public String getHDD() { return this.hdd; } @Override public String getCPU() { return this.cpu; } }

Server также implements Computer:

Пример

package com.journaldev.design.model; public class Server extends Computer { private String ram; private String hdd; private String cpu; public Server(String ram, String hdd, String cpu){ this.ram=ram; this.hdd=hdd; this.cpu=cpu; } @Override public String getRAM() { return this.ram; } @Override public String getHDD() { return this.hdd; } @Override public String getCPU() { return this.cpu; } }

Фабричный класс

Теперь, когда у нас есть несколько подклассов и суперкласс, мы можем создать фабричный класс:

Пример

package com.journaldev.design.factory; import com.journaldev.design.model.Computer; import com.journaldev.design.model.PC; import com.journaldev.design.model.Server; public class ComputerFactory { public static Computer getComputer(String type, String ram, String hdd, String cpu){ if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu); else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu); return null; } }

Важно отметить, что:

  • Класс фабрики может быть синглтоном, а getComputer может быть static.
  • getComputer — это метод класса фабрики, и он возвращает разные объекты на основе одних и тех же типов параметров.

Далее идёт простая тестовая клиентская программа, использующая приведённую выше реализацию шаблона проектирования «фабрика».

Пример

package com.journaldev.design.test; import com.journaldev.design.abstractfactory.PCFactory; import com.journaldev.design.abstractfactory.ServerFactory; import com.journaldev.design.factory.ComputerFactory; import com.journaldev.design.model.Computer; public class TestFactory { public static void main(String[] args) { Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz"); Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz"); System.out.println("Конфигурация ПК фабрики::"+pc); System.out.println("Конфигурация сервера фабрики::"+server); } }

Вывод:

Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

Преимущества паттерна проектирования «Фабрика»

  • Программирование через интерфейс воплощает идею объектно-ориентированного программирования.
  • Работа по созданию объектов переносится в класс фабрики.

Примеры паттерна проектирования «Фабрика» в JDK

  • java.util.Calendar, ResourceBundle и NumberFormat getInstance() используют паттерн фабричного метода.
  • valueOf() в классах-обёртках, таких как Boolean и Integer, также использует паттерн фабричного метода.

Перевод: https://www.jianshu.com/p/5d52e9ce7358

Оригинал: https://www.journaldev.com/1392/factory-design-pattern-in-java