Overview

Factory Method 패턴은 가장 널리 알려진 디자인 패턴 중 하나입니다.
객체를 반복적으로 생성해야 하며, 약간의 차이가 필요한 경우 Factory Method 패턴을 사용합니다.

Factory Method 패턴은 창의적인 패턴 중 하나입니다.
  1. 생성 패턴은 인스턴스 생성 절차를 추상화한 패턴이다.
  2. 생성 패턴에 속하는 패턴은 객체를 생성하고 합성하는 방법이나 객체의 표현을 시스템과 분리한다. 상속보다 복잡한 방법을 사용하는 방향으로 시스템이 발전함에 따라 생성 패턴이 더욱 중요해지고 있습니다.

생성 패턴에는 두 가지 중요한 문제가 있습니다.

Factory Method 패턴이란?
Factory Method 패턴은 객체를 생성하기 위한 인터페이스를 미리 정의하지만 인스턴스 생성에 대한 클래스의 결정은 서브클래스 측에서 결정하는 패턴입니다. 여러 하위 클래스가 있는 슈퍼 클래스가 있는 경우 들어오는 인수에 따라 하나의 자식 클래스 인스턴스를 반환합니다.
Factory Method 패턴은 클래스의 인스턴스를 서브클래스로 생성하는 시간을 지연시킵니다.

사용성
클래스가 생성해야 하는 객체의 클래스를 예측할 수 없는 경우
당신의 서브클래스가 생성될 객체를 기술하는 책임을 지정하기를 원할 때

Factory Method 패턴의 장점
Factory Method 패턴은 클라이언트 코드에서 서브클래스의 인스턴스를 제거하여 서로의 종속성을 낮추고 본드를 느슨하게 하며 확장을 쉽게 만듭니다.

Factory Method 패턴은 클라이언트와 구현 객체 간의 추상화를 제공합니다.

Factory Method 패턴의 단점
생성할 새 개체가 증가할 때마다 Factory 클래스에 추가해야 하기 때문에 더 많은 클래스가 있습니다.

 

Structure

https://ko.wikipedia.org/wiki/%ED%8C%A9%ED%86%A0%EB%A6%AC_%EB%A9%94%EC%84%9C%EB%93%9C_%ED%8C%A8%ED%84%B4

 

Code Example

package com.example.design.pattern;

import java.util.ArrayList;

abstract class Pizza {
	String name;
	String dough;
	String sauce;
	ArrayList<String> toppings = new ArrayList<String>();

	void prepare() {
		System.out.println("Preparing " + name);
		System.out.println("Tossing dough...");
		System.out.println("Adding sauce...");
		System.out.println("Adding toppings: ");
		for (int i = 0; i < toppings.size(); i++) {
			System.out.println("   " + toppings.get(i));
		}
	}

	void bake() {
		System.out.println("Bake for 25 minutes at 350");
	}

	void cut() {
		System.out.println("Cutting the pizza into diagonal slices");
	}

	void box() {
		System.out.println("Place pizza in official PizzaStore box");
	}

	public String getName() {
		return name;
	}

	public String toString() {
		StringBuffer display = new StringBuffer();
		display.append("---- " + name + " ----\n");
		display.append(dough + "\n");
		display.append(sauce + "\n");
		for (int i = 0; i < toppings.size(); i++) {
			display.append((String) toppings.get(i) + "\n");
		}
		return display.toString();
	}
}

class NYStyleCheesePizza extends Pizza {
	public NYStyleCheesePizza() {
		name = "NYStyleCheesePizza";
		dough = "Thin Crust Dough";
		sauce = "Marinara Sauce";
		toppings.add("Grated Reggiano Cheese");
	}
}

class NYStylePepperoniPizza extends Pizza {
	public NYStylePepperoniPizza() {
		name = "NYStylePepperoniPizza";
		dough = "Thin Crust Dough";
		sauce = "Marinara Sauce";
		toppings.add("Grated Reggiano Cheese");
	}
}

class ChicagoStyleCheesePizza extends Pizza {
	public ChicagoStyleCheesePizza() {
		name = "ChicagoStyleCheesePizza";
		dough = "Extra Thick Crust Dough";
		sauce = "Plum Tomato Sauce";
		toppings.add("Shredded Mozzarella Cheese");
	}

	void cut() {
		System.out.println("Cutting the pizza into square slices");
	}
}

class ChicagoStylePepperoniPizza extends Pizza {
	public ChicagoStylePepperoniPizza() {
		name = "ChicagoStylePepperoniPizza";
		dough = "Extra Thick Crust Dough";
		sauce = "Plum Tomato Sauce";
		toppings.add("Shredded Mozzarella Cheese");
	}

	void cut() {
		System.out.println("Cutting the pizza into square slices");
	}
}

abstract class PizzaStore {
	public Pizza orderPizza(String type) {
		Pizza pizza;

		pizza = createPizza(type); // back to a method call

		pizza.prepare(); // complete methods
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}

	abstract Pizza createPizza(String type);
}

class NYStylePizzaStore extends PizzaStore {
	public Pizza createPizza(String type) {
		Pizza pizza = null;

		if (type.equals("cheese")) {
			pizza = new NYStyleCheesePizza();
		} else if (type.equals("pepperoni")) {
			pizza = new NYStylePepperoniPizza();
		}

		return pizza;
	}
}

class ChicagoStylePizzaStore extends PizzaStore {
	public Pizza createPizza(String type) {
		Pizza pizza = null;

		if (type.equals("cheese")) {
			pizza = new ChicagoStyleCheesePizza();
		} else if (type.equals("pepperoni")) {
			pizza = new ChicagoStylePepperoniPizza();
		} 
		
		return pizza;
	}
}

public class MyFactory {
	public static void main(String[] args) {
		PizzaStore nyStore = new NYStylePizzaStore();
		PizzaStore chicagoStore = new ChicagoStylePizzaStore();

		Pizza pizza = nyStore.orderPizza("cheese");
		System.out.println("Ethan ordered a " + pizza.getName() + "\n");

		pizza = chicagoStore.orderPizza("cheese");
		System.out.println("Ethan ordered a " + pizza.getName() + "\n");

		pizza = nyStore.orderPizza("pepperoni");
		System.out.println("Ethan ordered a " + pizza.getName() + "\n");

		pizza = chicagoStore.orderPizza("pepperoni");
		System.out.println("Ethan ordered a " + pizza.getName() + "\n");
	}
}

 

Console Result

Preparing NYStyleCheesePizza
Tossing dough...
Adding sauce...
Adding toppings: 
   Grated Reggiano Cheese
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a NYStyleCheesePizza

Preparing ChicagoStyleCheesePizza
Tossing dough...
Adding sauce...
Adding toppings: 
   Shredded Mozzarella Cheese
Bake for 25 minutes at 350
Cutting the pizza into square slices
Place pizza in official PizzaStore box
Ethan ordered a ChicagoStyleCheesePizza

Preparing NYStylePepperoniPizza
Tossing dough...
Adding sauce...
Adding toppings: 
   Grated Reggiano Cheese
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a NYStylePepperoniPizza

Preparing ChicagoStylePepperoniPizza
Tossing dough...
Adding sauce...
Adding toppings: 
   Shredded Mozzarella Cheese
Bake for 25 minutes at 350
Cutting the pizza into square slices
Place pizza in official PizzaStore box
Ethan ordered a ChicagoStylePepperoniPizza

 

Conclusion

N/A

728x90

+ Recent posts