[자바 디자인패턴 소스코드] Factory Pattern
- Java/Java
- 2022. 6. 15. 22:06
펙토리 패턴
/**
* 팩토리패턴은 객체를 생성하는 코드를 별도의 클래스/매서드로 분리함으로써
* 객체 생성 방식의 변화에 대비하는 데 유용하다.
*/
public class FactoryPattern {
public static void main(String[] args) {
FactoryManager benz = new BenzFactory();
benz.requestProduct(10, PRODUCT.SUV);
benz.requestProduct(10, PRODUCT.TRUCK);
FactoryManager bmw = new BmwFactory();
bmw.requestProduct(5, PRODUCT.SEDAN);
}
}
/**
* Creator
*/
abstract class FactoryManager {
public FactoryManager() {
System.out.print("Factory_");
}
/**factoryMethod()*/
protected abstract Brand getBrand();
/**anOperation()*/
public void requestProduct(int count, PRODUCT product) {
Brand brand = getBrand();
brand.makeProduct(this, count, product);
}
}
/**
* ConcreteCreator 01
*/
class BenzFactory extends FactoryManager {
public BenzFactory() {
super();
System.out.println("Benz activated.");
}
/**factoryMethod()*/
@Override
protected Brand getBrand() {
Brand brand = Benz.getInstance();
return brand;
}
}
/**
* ConcreteCreator 02
*/
class BmwFactory extends FactoryManager {
public BmwFactory() {
super();
System.out.println("Bmw activated.");
}
/**factoryMethod()*/
@Override
protected Brand getBrand() {
Brand brand = Bmw.getInstance();
return brand;
}
}
/**
* Product
*/
interface Brand {
void makeProduct(FactoryManager manager, int count, PRODUCT product);
}
/**
* ConcreteProduct 01
*/
class Benz implements Brand {
private static Brand brand;
private Benz(){}
public static Brand getInstance() {
if(brand == null) {
brand = new Benz();
}
return brand;
}
@Override
public void makeProduct(FactoryManager manager, int count, PRODUCT product) {
System.out.println("\t-" + manager.getClass().getSimpleName() + ": " + product.getValue() + " " + count);
}
}
/**
* ConcreteProduct 02
*/
class Bmw implements Brand {
private static Brand brand;
private Bmw(){}
public static Brand getInstance() {
if(brand == null) {
brand = new Bmw();
}
return brand;
}
@Override
public void makeProduct(FactoryManager manager, int count, PRODUCT product) {
System.out.println("\t-" + manager.getClass().getSimpleName() + ": " + product.getValue() + " " + count);
}
}
enum PRODUCT {
SEDAN("Sedan"), TRUCK("Truck"), SUV("SUV");
private String value;
private PRODUCT(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
'Java > Java' 카테고리의 다른 글
[자바 디자인패턴 소스코드] Composite Pattern (0) | 2022.06.20 |
---|---|
[자바 디자인패턴 소스코드] Abstract Factory Pattern (0) | 2022.06.16 |
[자바 디자인패턴 소스코드] Template Pattern (0) | 2022.06.08 |
[자바 디자인패턴 소스코드] Decorator Pattern (0) | 2022.06.02 |
[자바 디자인패턴 소스코드] Observer Pattern (0) | 2022.06.02 |
이 글을 공유하기