Рубрики
Без рубрики

Абстрактный шаблон проектирования фабрики в Java

Абстрактный шаблон проектирования фабрики на Java, Абстрактный шаблон фабрики на Java, Разница между шаблоном фабрики и абстрактным шаблоном фабрики, пример учебника по абстрактному шаблону фабрики.

Автор оригинала: Pankaj Kumar.

Добро пожаловать в Абстрактный шаблон проектирования фабрики в примере java. Абстрактный шаблон дизайна фабрики является одним из шаблонов создания. Абстрактный фабричный узор почти похож на фабричный узор, за исключением того факта, что он больше похож на фабрику фабрик.

Абстрактная фабрика

Если вы знакомы с шаблоном проектирования фабрики в java , вы заметите, что у нас есть один класс фабрики. Этот заводской класс возвращает различные подклассы на основе предоставленных входных данных, и заводской класс использует оператор if-else или switch для достижения этой цели.

В абстрактном фабричном шаблоне мы избавляемся от блока if-else и создаем заводской класс для каждого подкласса. Чем абстрактный заводской класс, который вернет подкласс на основе входного заводского класса. Сначала это кажется запутанным, но как только вы увидите реализацию, действительно легко понять и понять незначительную разницу между фабричным и абстрактным фабричным шаблоном.

Как и в нашем посте с фабричным шаблоном, мы будем использовать один и тот же суперкласс и подклассы.

Абстрактный шаблон заводского проектирования Суперкласс и Подклассы

Абстрактный шаблон заводского проектирования Суперкласс и Подклассы

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();
    }
}

Абстрактный шаблон заводского проектирования Суперкласс и Подклассы

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;
    }
 
}

Абстрактный шаблон заводского проектирования Суперкласс и Подклассы

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.abstractfactory;

import com.journaldev.design.model.Computer;

public interface ComputerAbstractFactory {

	public Computer createComputer();

}

Обратите внимание, что метод create Computer() возвращает экземпляр суперкласса Компьютер . Теперь наши фабричные классы реализуют этот интерфейс и вернут свой соответствующий подкласс.

Обратите внимание, что метод || create Computer() || возвращает экземпляр суперкласса || Компьютер || . Теперь наши фабричные классы реализуют этот интерфейс и вернут свой соответствующий подкласс.

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;

public class PCFactory implements ComputerAbstractFactory {

	private String ram;
	private String hdd;
	private String cpu;
	
	public PCFactory(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
	@Override
	public Computer createComputer() {
		return new PC(ram,hdd,cpu);
	}

}

Аналогично у нас будет заводской класс для подкласса Server .

Аналогично у нас будет заводской класс для подкласса || Server||.

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.Server;

public class ServerFactory implements ComputerAbstractFactory {

	private String ram;
	private String hdd;
	private String cpu;
	
	public ServerFactory(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
	
	@Override
	public Computer createComputer() {
		return new Server(ram,hdd,cpu);
	}

}

Теперь мы создадим класс-потребитель, который обеспечит точку входа для клиентских классов для создания подклассов.

Теперь мы создадим класс-потребитель, который обеспечит точку входа для клиентских классов для создания подклассов.

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;

public class ComputerFactory {

	public static Computer getComputer(ComputerAbstractFactory factory){
		return factory.createComputer();
	}
}

Обратите внимание, что это простой класс, и Метод get Computer принимает Абстрактную фабрику компьютера аргумент и возвращает Компьютер объект. На этом этапе реализация должна быть ясной.

Давайте напишем простой метод тестирования и посмотрим, как использовать абстрактную фабрику для получения экземпляра подклассов.

Давайте напишем простой метод тестирования и посмотрим, как использовать абстрактную фабрику для получения экземпляра подклассов.

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 TestDesignPatterns {

	public static void main(String[] args) {
		testAbstractFactory();
	}

	private static void testAbstractFactory() {
		Computer pc = com.journaldev.design.abstractfactory.ComputerFactory.getComputer(new PCFactory("2 GB","500 GB","2.4 GHz"));
		Computer server = com.journaldev.design.abstractfactory.ComputerFactory.getComputer(new ServerFactory("16 GB","1 TB","2.9 GHz"));
		System.out.println("AbstractFactory PC Config::"+pc);
		System.out.println("AbstractFactory Server Config::"+server);
	}
}

Результатом вышеуказанной программы будет:

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

Вот диаграмма классов реализации абстрактного шаблона проектирования фабрики.

Преимущества Абстрактного Заводского Шаблона Проектирования

  • Абстрактный шаблон проектирования фабрики обеспечивает подход к коду для интерфейса, а не к реализации.
  • Абстрактный фабричный шаблон является “фабрикой фабрик” и может быть легко расширен для размещения большего количества продуктов, например, мы можем добавить еще один ноутбук подкласса и фабрику по производству ноутбуков.
  • Абстрактный фабричный шаблон надежен и позволяет избежать условной логики фабричного шаблона.

Абстрактные примеры шаблонов проектирования фабрики в JDK

  • javax.xml.парсеры.DocumentBuilderFactory#Новая установка()
  • javax.xml.преобразование.TransformerFactory#Новая установка()
  • javax.xml.xpath.XPathFactory#Новая установка()

Видеоурок по Абстрактному дизайну фабрики

Недавно я загрузил видео на YouTube для абстрактного шаблона дизайна фабрики. В видео я обсуждаю, когда и как реализовать абстрактный фабричный шаблон. Я также обсуждал, в чем разница между фабричным шаблоном и абстрактным шаблоном фабричного дизайна.