본문 바로가기

자바

Factory Method 패턴

package com.devjones.framework;

public abstract class Product {

	public abstract void use();
}

 

package com.devjones.framework;

public abstract class Factory {

	public final Product create(String owner) {
		
		Product p = createProduct(owner);
		registerProduct(p);
		
		return p;
	}
	
	protected abstract Product createProduct(String owner);
	protected abstract void registerProduct(Product product);
}

 

package com.devjones.idcard;

import com.devjones.framework.Product;

public class IDCard extends Product {

	private String owner;
	
	IDCard(String owner) {
		
		System.out.println(owner + "의 카드를 만듭니다.");
		this.owner = owner;
	}
	
	@Override
	public void use() {
		
		System.out.println(owner + "의 카드를 사용합니다.");
	}

	public String getOwner() {
		return owner;
	}

}

 

package com.devjones.idcard;

import java.util.ArrayList;
import java.util.List;

import com.devjones.framework.Factory;
import com.devjones.framework.Product;

public class IDCardFactory extends Factory {

	private List<String> owners = new ArrayList<String>();

	@Override
	protected Product createProduct(String owner) {
		
		return new IDCard(owner);
	}

	@Override
	protected void registerProduct(Product product) {
		
		owners.add( ((IDCard)product).getOwner() );
	}

	public List<String> getOwners() {
		return owners;
	}
}

 

package com.devjones.main;

import com.devjones.framework.Factory;
import com.devjones.framework.Product;
import com.devjones.idcard.IDCardFactory;

public class Main {

	public static void main(String[] args) {
		
		Factory factory = new IDCardFactory();
		Product card1 = factory.create("홍길동");
		Product card2 = factory.create("이순신");
		Product card3 = factory.create("강감찬");
		
		card1.use();
		card2.use();
		card3.use();
	}
}

 

결과:

홍길동의 카드를 만듭니다.
이순신의 카드를 만듭니다.
강감찬의 카드를 만듭니다.
홍길동의 카드를 사용합니다.
이순신의 카드를 사용합니다.
강감찬의 카드를 사용합니다.

'자바' 카테고리의 다른 글

빅오 표기법  (0) 2021.04.03
[자바] 추상 클래스 예제  (0) 2021.02.11
SAX parser를 활용한 XML 파싱  (0) 2020.12.24
@Qualifier  (0) 2020.12.24
Properties  (0) 2020.12.05