2014-02-23 2 views
1

나는 패턴을 디자인하는 초보자입니다. 그리고 저는 몇몇 디자인 패턴을 배우려고합니다.공장 설계 패턴을 사용하지 않으면 어떻게됩니까?

블로그를 온라인에서 읽었으며 대부분의 사람들이 직접 다음과 같이 직접 보여줍니다. 이것은 단순한 공장이며 이것이 우리가 사용하는 방식입니다.

저는 상속과 인터페이스를 이해하고 있으며 물론 자바를 사용하고 있습니다. 디자인 시스템에 많은 경험이 없습니다.

제 질문은 : 공장 디자인 패턴을 사용하지 않으면 어떻게됩니까? 내 말은, 누군가 공장 디자인 패턴을 사용하지 않으면 혼란에 빠질 수있는 경우를 줄 수 있습니까?

+1

이 질문은 당신이 직면하고있는 실제의 실질적인 코딩 문제가 아니기 때문에 논제가 아닌 것처럼 보입니다. – jmort253

+0

@ jmort253 .I 블로그를 많이 찾았습니다. 사용하지 않으면 엉망이 될 것이라고 말하는 대신 항상 "사용 방법"으로 시작합니다. –

+0

StackOverflow에 오신 것을 환영합니다. 패턴은 개발자 도구 상자이므로 공장 패턴이 최적의 솔루션이 아닌 경우가 많습니다. 중요한 것은 사용 가능한 여러 가지 패턴을 파악하여 가장 적합한 패턴을 선택할 수 있다는 것입니다. 패턴은 성장하는 시스템이 점점 더 유용 해짐에 따라 누군가에게 당신에게 좋은 대답을주기가 어렵습니다. – spikeheap

답변

0

이 질문에 좀 걸릴 수 있습니다 (이 유일한 혜택 없음). 그들 중 몇 명은 "간단한 공장 설계 패턴을 사용하고 싶지 않으면 어떻게합니까?"라는 질문을 설명합니다.

간단한 공장 디자인 패턴을 사용하지 않는다면 어떻게 될지 알려드립니다. 나는 부자이고 자기가 BMW, Audi, Benz 등을 가지고있는 자동 창고를 소유하고 있다고 가정 해 봅시다.

BMW를 운전하려면 엔진 (V4, V6 및 V8)을 선택할 수 있습니다. 나는 또한 넥타이, 18 ", 19"및 20 "을 선택할 수 있습니다. 등등. 거의 내가 운전하고 싶을 때마다, 나는 나의 차를 개인화 할 수있다. 예를 들어,이 경우 엔진 만 신경 씁니다. 보통, 나는 다음과 같은 엔진을 지정해야한다 : "BMWV4-v2.0-1058", V4 엔진, 2.0L 그리고 식별 번호 1058. 그리고 나는 클래스 카를 가지고있다, BMW, 아우디와 벤츠는 차를 확장한다. 여기 내 차가 있습니다 :

//Define the parent class. When we Init a Car, we need to specify the engine. 
public class Car { 
    protected String engine = null; 
     
    public Car(){ 
         
    } 
     
    public Car(String engine){ 
        this.engine = engine; 
    } 
     
    public void drive() { 
        System.out.print("Driving Car with engine: "+this.engine); 
    } 
} 
  
//Those are the implementation of cars 
class BMW extends Car{ 
  
    public BMW(String engine){ 
        super.engine = engine; 
    } 
  
    @Override 
    public void drive() { 
        System.out.println("Driving BWM with engine: "+super.engine);     
    } 
     
} 
class Audi extends Car{ 
  
    public Audi(String engine){ 
        super.engine = engine; 
    } 
  
    @Override 
    public void drive() { 
        System.out.println("Driving Audi with engine: "+super.engine);     
    } 
     
} 
class Benz extends Car{ 
  
    public Benz(String engine){ 
        super.engine = engine; 
    } 
  
    @Override 
    public void drive() { 
        System.out.println("Driving Benz with engine: "+super.engine);     
    } 
     
} 

우리가 볼 수 있듯이, 자동차의 생성자는 엔진 유형을 취할 것입니다. 그리고 지금, 나는 운전하고 싶습니다 : // 이것은 나입니다. 저는 부자이고 차를 운전하고 싶습니다.

public class RichMan { 
    public static void main(String[] args){ 
     //Monday, drive my BMW. Oh Yeah~ 
     Car MondayCar = new BMW("BMWV4-v2.0-1058"); 
     MondayCar.drive(); 
     //Tuseday, drive the Benz 
     Car TuesdayCar = new Benz("BenzV6-v2.5-4315"); 
     TuesdayCar.drive(); 
     //Wed, drive the Audi, Let's roll 
     Car WedCar = new Audi("AudiV8-v3.0-3513-supercharged"); 
     WedCar.drive(); 
    } 
} 

모든 것이 잘 어울립니다. 그러나 문제는 다음과 같습니다. 엔진 이름을 기억해야합니다. 때로는 그것들을 기억하기가 쉽지 않습니다. 이미지는 내가 부자가 많고 차가 많다. 우리가 공장 패턴을 사용하지 않는다면 이것은 정확히 문제입니다. 우리는 모든 자동차를 알아야합니다. 우리는 자동차를 만들기 위해 모든 것을 알아야합니다.

이 작업을 위해 나는 자동차 창고에서 일하는 사람을 고용하기로 결정했습니다. 그리고 전체 자동차 창고는 이제 공장입니다. 공장은 엔진이 무엇인지 정확하게 알고 있습니다. 그리고 매일, 공장에서 준비하고 싶은 차를 얻을 것입니다.그것 뿐이다

//This is me, I'm rich and I want to drive my cars. 
public class RichMan { 
    public static void main(String[] args){ 
     //Monday, drive my BMW. Oh Yeah~ 
     Car MondayCar = new BMW("BMWV4-v2.0-1058"); 
     MondayCar.drive(); 
     //Tuseday, drive the Benz 
     Car TuesdayCar = new Benz("BenzV6-v2.5-4315"); 
     TuesdayCar.drive(); 
     //Wed, drive the Audi, Let's roll 
     Car WedCar = new Audi("AudiV8-v3.0-3513-supercharged"); 
     WedCar.drive(); 

     //Thursday, I don't need to remember any of my car's engine type. 
     Car ThursdayCar = new MyCarFactory("Audi").getMyCar(); 
     ThursdayCar.drive(); 
    } 

} 

을 :

public class MyCarFactory { 
    private Car myCar; 

    //Now, My factory will remember all the engine type 
    public MyCarFactory(String car){ 
     if(car.equals("BMW")){ 
      this.setMyCar(new BMW("BMWV4-v2.0-1058")); 
     } 
     else if(car.endsWith("Benz")){ 
      this.setMyCar(new Benz("BenzV6-v2.5-4315")); 
     } 
     else{ 
      this.setMyCar(new Audi("AudiV8-v3.0-3513-supercharged")); 
     } 
     /* 
     * Here, in the future, if I have more cars, I can add them here, 
     * If new upgrade of engine, I can change the engine here. 
     * I can even hire someone to work in this factory and do all the things for me. 
     * At any memont, as a rich man, I only drive, no need to know details. 
     */ 
    } 

    public Car getMyCar() { 
     return myCar; 
    } 

    public void setMyCar(Car myCar) { 
     this.myCar = myCar; 
    } 
} 

지금, 나를 위해, 부유 한 사람으로서, 나는 단지 할 필요가있다. 이것이 바로 아이디어입니다. 나는 빌어 먹을 빌어 먹을 하나님이고, 멋진 자동차를 운전할 준비를 갖추기위한 모든 세부 사항을 기억하고 싶지는 않습니다. 내 공장에서 처리 할 것이고 운전 만하면됩니다. 건배 ~ ~ 내 블로그에서 더 많은 것을 전망하십시오 : Why we use simple factory design pattern? Reasons and examples

0

생성 된 객체의 수명주기를 사용 범위를 넘어서 제어해야하는 경우 팩토리 패턴이 유용합니다. 예를 들어, 여러 개의 요청에 대해 동일한 기본 리소스에 대한 참조를 반환하는 이미지 리소스 팩토리를 만들면 값 비싼 IO 작업을 피할 수 있습니다.

대부분의 패턴과 마찬가지로 트레이드 오프가 있습니다. 패턴을 사용하여 발생하는 문제를 해결하고 이해하십시오. 예방 적으로 패턴을 사용하는 것을 피하십시오. 그 이유는 일반적으로보다 이해하기 쉽고 버그에 더 취약한 더 복잡한 코드를 생성하기 때문입니다.

0

예를 들어 팩토리 디자인 패턴은 동일한 매개 변수 유형이지만 동작이 다른 여러 "생성자"가 필요할 때 유용합니다.

당신은 온라인으로 간단한 공장을 설명하는 튜토리얼의 톤이있다 Factory Pattern. When to use factory methods?

관련 문제