2014-03-06 2 views
1

내가 클래스 자동차가있는 경우 :생성자

public class Car { 

    int weight; 
    Car(){} 

    public Car(int weight) { 
     this.weight = weight; 
    } 
} 

및 차량에서 상속 다른 클래스 세단 :

public class Sedan extends Car { 

    public Sedan(int weight) { 
     super(weight); 
    } 
} 

을 또한 자동차에서 상속의 제 3 유형의 지프를 :

public class Jeep extends Car { 

    public Jeep(int weight) { 
     super(weight); 
    } 
} 

나는 그래서 그것을 만들 수있는 방법이 내가 Car mercedes = new Car(5000);

012을 말할 때

생성자는 주어진 무게에 따라 new Jeep 또는 new Sedan을 만듭니다. 을 생성하고 그렇지 않으면 세단 mercedes=new Sedan(weight);을 만듭니다.

+2

의 끝에서 모든 차량입니다. 당신이 필요로하는 것은 공장입니다. (각각의 생성자를 호출하는 메소드) –

답변

8

factory pattern을 사용하고 싶습니다. 즉, 별도의 클래스를 작성하면 해당 객체를 빌드하고 반환해야합니다. Car 객체입니다. 예를 들어

:

class CarFactory { 
    public Car createCar(int weight) { 
     if (weight < 3000) { 
       return new Sedan(weight); 
     } else { 
       return new Jeep(weight); 
     } 
    } 
} 

사용법 :

CarFactory carFactory = new CarFactory(); 
Car car = carFactory.createCar(yourDesiredWeight); 

이것은 당신이 문제를 해결하는 데 도움이뿐만 아니라 더 나은 방식으로 코드를 구성하는 데 도움이뿐만 아닙니다. 나는. 클래스를 조작 할 클래스에서 자동차를 만드는 책임을 제거합니다.

참고 :single responsibility principle (SRP, for short)을 읽어 보시기 바랍니다.

주 2 : 그것은 일반적으로 기본 클래스가 파생 된 모든 유형의 직접 (public abstract class Car {...}) 초기화하면 이해가되지 않기 때문에 추상적으로 클래스를 Car 요구를 보인다.

+0

공장 패턴에 대해 알고 있습니다. 그것이 자동차의 생성자에서 직접 할 수 있는지 궁금 해서요. 고맙습니다. – user120404

+0

@ user120404 인스턴스화 된 객체의 유형을 변경할 수 없으며 ctor가 호출 된 경우 객체가 인스턴스화되었음을 의미합니다. – Leri

2

원하는대로 할 수 없습니다.

: 당신이 찾고있는 당신은 공장 패턴에게 위임 패턴을 병합 할 수

(끔찍한 형태로 내가하지 않는 것이 좋습니다 및 임) Abstract Factory Pattern

public abstract class AbstractCarFactory{ 
     public static Car createCar(int weight){ 
     Car ret=null; 
      if (weight>3000) { 
      car=new Jeep(weight); 
      } else { 
      car=new Sedan(weight); 
      } 
     return car; 
     } 
    } 

이 다른 옵션을 추가입니다

public class Car { private Car car; protected Car() { } public Car(int weight) { if (weight>3000) { car=new Jeep(weight); } else { car=new Sedan(weight); } } public String getType() { return car.getType(); } } 

자동차 클래스는 지프 또는 세단을 만들고 모든 호출을 위임합니다.

public class Jeep extends Car { 
    int weight; 

    public Jeep(int weight) { 
     super(); 
     this.weight = weight; 
    } 
    public String getType() { 
     return "JEEP"; 
    } 
} 

다시 말하지만, 이는 실제로 고의적이므로 수행해서는 안됩니다.

1

캡슐화를 기억하십시오.

public class Car{ 

    private int weight ; 

    public Car(){ 

    } 

    public Car(int weight){ 
     this.weight = weight; 
    } 

} 

그냥 차 인스턴스화하려면 : 당신은 어디서든 당신이 원하는 그 전화를 걸 수 있습니다

Car someCar = new Car(Insert Weight Here); 

합니다.이것은 상속이 일반적으로 사용되는 방법이 아닙니다. 좀 더 명확히하기를 원할 수도 있습니다. 일반적으로이 같은 일을 :

Car somecar = new Jeep(4000); 

또는

Car somecar = new Sedan (1000); 

하지만 그들은 일하지 생성자 내에서