[디자인 모델] 의 공장 방법 (Factory Method)
공장 방법의 정 의 는 창설 대상 을 위해 인 터 페 이 스 를 정의 하지만 하위 클래스 가 어떤 클래스 를 실례 화 할 지 결정 하도록 한다.공장 방법 은 하나의 종 류 를 하위 류 로 예화 시 켰 다.
영어 정의: define an interface for creating an object, but let subclasses decider which class to instantiate. Factory Method lets a class defter instantiation to subclasses.
'Header First' 는 OO 디자인 의 원칙 인 - Depend Upon abstractions. Do not depend upon concrete classes 를 소개 합 니 다. 'GOF' 에서 비슷 한 표현 을 찾 을 수 있 습 니 다. Frameworks use abstract classes to define and maintained relationships between objects. 공장 방법 은 추상 과 실현 을 분리 시 켜 클 라 이언 트 가 대상 의 구체 적 인 실현 에 관심 을 가지 지 않 아 도 된다 는 것 을 알 수 있 습 니 다.상대 가 만 나 는 관계 에 만 관심 을 가 져 야 한다.
추상 공장 의 구조 도 는 다음 과 같다.
만약 에 아버지 류 중의 공장 방법 이 내용 을 실현 하지 못 하면 템 플 릿 방법 (template method) 의 디자인 모델 을 사 용 했 고 실현 내용 이 있 으 면 공장 방법 은 기본 대상 을 만 드 는 방법 을 제공 하여 공장 방법의 유연성 을 증가 시 켰 고 자 류 는 override 가 필요 하지 않 을 수 있다.
평행 계승 구조 에서 공장 방법 은 두 개의 계승 체 계 를 연결 하 는 역할 을 할 수 있다.
공장 방법 에서 lazy initialization 을 사용 할 수 있 습 니 다.
공장 방법 은 매우 광범 위 하 게 사용 되 어야 한다. 아래 에 제 시 된 예시 코드 는 < Header First > 에서 나온다.
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type);
}
public class NYPizzaStore extends PizzaStore {
public Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new NYStyleCheesePizza();
}
return null;
}
}
public class ChicagoPizzaStore extends PizzaStore {
protected Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new ChicagoStyleCheesePizza();
}
return null;
}
}
import java.util.ArrayList;
public 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 class NYStyleCheesePizza extends Pizza {
public NYStyleCheesePizza() {
name = "NY Style Sause and Cheese Pizza";
dough = "Thin Crust Dough";
sauce = "Marinara Sauce";
toppings.add("Grated Reggiano Cheese");
}
}
public class ChicagoStyleCheesePizza extends Pizza {
public ChicagoStyleCheesePizza() {
name = "Chicago Style Deep Dish Cheese Pizza";
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");
}
}
import java.util.ArrayList;
public 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;
}
}
factory method 와 abstract factory 의 차 이 는 factory method 는 한 제품 만 생산 하고 abstract factory 는 families of products 를 생산 합 니 다.
abstract factory 는 제품 이 집 중 된 모든 제품 을 생산 할 때 factory method 를 사용 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.