2016-12-28 7 views
5

저는 현재 학생 프로젝트를 진행 중이며 팩토리 메소드로만 객체를 만드는 방법이 있는지 궁금하십니까?공장에서만 독점적으로 객체 만들기

public class PersonFactory { 

    public static Person createPerson() { 
     // some constraints ... 
     return new Person(); 
    } 

} 

은 내가 PersonFactory.java 예시는 그 createPerson() 방법 Person 개체를 반환하기로되어있다.

public class Person { 

    // some examples ... 
    private String name; 
    private int age; 

    public Person() { 
     // ... 
    } 

} 

이 잘 작동하지만, main 프로그램에서, 나는 아직도 (이 public 때문에) 공통의 생성자를 Person 개체를 만들 수 있어요. 그러나 생성자를 private으로 변경하면 팩토리 메서드에서 해당 메서드에 액세스 할 수 없습니다.

+1

공지 사항 공장 등급. 개인 생성자를 정의하고 팩토리 메소드 (예 :자식 클래스에 의해 구현되거나 재정의 될 수있는 getInstance()도 패턴의 유효한 사용법입니다. –

답변

3

나는 대개 팩토리 메서드를 별도의 팩토리 클래스가 아닌 Person 클래스에 넣음으로써이 문제를 해결합니다. 이 경우 생성자는 private 일 수 있으며 Person 객체는 팩토리 메서드에서 가져올 수 있습니다. 그래도 그것이 당신의 디자인에 들어갈 수 있는지는 모르겠다.

여기에 하나의 잠재적 인 문제는 공장 방법 static을 원하지 않는 경우입니다. 그러나 나는 네가 있다는 것을 알기 때문에 이것이 너를 막을 수는 없다.

+0

팩토리 클래스를 대상 클래스의 public, static, inner 클래스로 만들고 factory 클래스에 public 인스턴스 메소드를 제공하여 '정적'문제를 해결할 수 있습니다. –

6

당신은 즉은 동일한 패키지에서 클래스에 액세스 할 수 있도록 할 public 액세스 한정자)를 분리합니다 (Person 생성자 패키지는 비공개로 할 수 있습니다)

public class PersonManagement { 

    public static void main(String[] args) { 
     // both still works ... 
     Person p1 = new Person(); 
     Person p2 = PersonFactory.createPerson(); 
    } 

} 

는 사전에 너무 감사드립니다.

그런 다음 PersonFactoryPerson과 동일한 패키지에 속하면 해당 생성자에 액세스 할 수 있습니다.

PersonManagement이 다른 패키지에 속하면 해당 생성자에 액세스 할 수 없습니다.

또 다른 옵션은 Person 생성자를 private으로 유지하고 createPerson() 메서드를 Person 클래스로 옮기는 것입니다.

1

자바의 가시성 개념을 사용하면 할 수있는 일이 많지 않습니다. Person 생성자에서 public을 제거하면 Person (및 하위 클래스는 Person)의 동일한 패키지에있는이 클래스 만 생성자에 액세스 할 수 있습니다. PersonManagement이 다른 패키지에 있으면 생성자에 액세스 할 수 없습니다.

Person을 PersonFactory의 내부 클래스 (또는 그 반대로)로 만들면 개인 생성자도 작동해야하고 외부 클래스 외부의 아무도 액세스 할 수 없게됩니다.

0

고마워요,이 사람은 꽤 많이 내 문제를 해결 :

public class Person { 

    // some examples ... 
    private String name; 
    private int age; 

    private Person() { 
    } 

    public static Person createPerson() { 
     // some constraints ... 
     return new Person(); 
    } 

} 

그리고 꽤 괜찮뿐만 아니라 main 작품 : 공장 패턴은을 사용하도록 강요하지 않습니다

public class PersonManagement { 

    public static void main(String[] args) { 
     Person p1 = Person.createPerson(); 
     // not possible anymore ... 
     Person p2 = new Person(); 
    } 

}