웹사이트 검색

Java의 추상 공장 디자인 패턴


Java 예제의 추상 팩토리 디자인 패턴에 오신 것을 환영합니다. Abstract Factory 디자인 패턴은 Creational 패턴 중 하나입니다. 추상 팩토리 패턴은 팩토리 오브 팩토리에 더 가깝다는 점을 제외하고는 팩토리 패턴과 거의 유사합니다.

추상 공장

추상 팩토리 디자인 패턴 슈퍼 클래스 및 서브 클래스

컴퓨터.자바

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

PC.자바

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

각 하위 클래스에 대한 팩토리 클래스

먼저 Abstract Factory 인터페이스 또는 추상 클래스를 만들어야 합니다. ComputerAbstractFactory.java

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;

public interface ComputerAbstractFactory {

	public Computer createComputer();

}

createComputer() 메서드는 슈퍼 클래스 Computer의 인스턴스를 반환합니다. 이제 우리의 팩토리 클래스는 이 인터페이스를 구현하고 각각의 하위 클래스를 반환합니다. PCFactory.java

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 하위 클래스에 대한 팩토리 클래스가 있습니다. ServerFactory.java

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

}

이제 클라이언트 클래스가 하위 클래스를 만들 수 있도록 진입점을 제공하는 소비자 클래스를 만듭니다. ComputerFactory.java

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;

public class ComputerFactory {

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

간단한 클래스와 getComputer 메서드는 ComputerAbstractFactory 인수를 수락하고 Computer 개체를 반환합니다. 이 시점에서 구현이 명확해지고 있어야 합니다. 간단한 테스트 메서드를 작성하고 추상 팩토리를 사용하여 하위 클래스의 인스턴스를 가져오는 방법을 살펴보겠습니다. TestDesignPatterns.java

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

추상 팩토리 디자인 패턴의 이점

  • Abstract Factory 디자인 패턴은 구현보다는 인터페이스를 위한 코드 접근 방식을 제공합니다.
  • Abstract Factory 패턴은 \공장 중의 공장\이며 더 많은 제품을 수용하도록 쉽게 확장할 수 있습니다. 예를 들어 다른 하위 클래스인 Laptop과 Factory LaptopFactory를 추가할 수 있습니다.
  • Abstract Factory 패턴은 견고하며 Factory 패턴의 조건 논리를 피합니다.

JDK의 추상 팩토리 디자인 패턴 예제

  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()

추상적인 공장 디자인 패턴 비디오 자습서

최근에 추상적인 공장 디자인 패턴에 대한 영상을 유튜브에 올렸습니다. 동영상에서는 추상 팩토리 패턴을 구현하는 시기와 방법에 대해 설명합니다. 또한 팩토리 패턴과 추상 팩토리 디자인 패턴의 차이점에 대해서도 논의했습니다. https://youtu.be/BPkYkyVWOaw

내 GitHub 프로젝트에서 예제 코드를 다운로드할 수 있습니다.