[참고. '캘린더'는 일정한 일정을 분리하고, '일정'은 일정에서 하나의 일정을 분리하는 데 매우주의해야합니다. 귀하의 질문에 약간의 혼란이있을 수 있습니다.]
공장 디자인 패턴에는 여러 가지 변형이 있습니다.
독립형 편의 기능 (예를 들어, calendarMaker (데이터)) 대상 클래스 (달력)를 구축
별도의 클래스 (예를 들어, CalendarParser).
클래스 수준 메서드 (예 : Calendar.from_string) 메서드입니다.
이들은 다른 용도로 사용됩니다.모두 Pythonic입니다. 질문은 "무엇이 당신입니까 은입니까?" "무엇이 바뀔까?" 의미는 모든 것입니다. 변화가 중요합니다.
편의 기능은 Pythonic입니다. Java와 같은 언어는 부동 함수를 가질 수 없습니다. 당신은 클래스에서 외로운 함수를 감싸 야합니다. Python을 사용하면 클래스의 오버 헤드없이 외로운 함수를 사용할 수 있습니다. 함수는 생성자가 상태 변경이나 대체 전략 또는 이전 작업의 메모리가없는 경우 적합합니다.
때때로 사람들은 클래스를 정의한 다음 클래스의 인스턴스를 만들고 상태 및 전략 및 기타 구성에 대한 일반적인 매개 변수를 설정 한 다음 해당 클래스의 단일 관련 메서드를 호출하는 편의 함수를 제공합니다. 이것은 클래스의 statefulness와 독립 실행 형 함수의 유연성을 모두 제공합니다.
클래스 수준 메서드 패턴이 사용되지만 제한이 있습니다. 하나는 클래스 수준 변수에 의존해야한다는 것입니다. 이러한 것들은 혼란 스러울 수 있기 때문에, static 메소드로서의 복잡한 생성자는 (statefulness 나 alternative 전략과 같은) feature를 추가 할 필요가있을 때 문제가된다. 정적 메소드를 결코 확장하지 말라.
둘째, 나머지 클래스 메서드 및 특성과는 관계가 없습니다. 이 종류의 from_string
은 Calendar 개체의 여러 가지 대체 인코딩 중 하나 일뿐입니다. from_xml
, from_JSON
, from_YAML
등이있을 수 있습니다. 이 중 아무 것도 캘린더의 의미와 관련성이 거의 없습니다. 이 메소드는 모두 캘린더가 전송을 위해 인코딩되는 방법에 관한 것입니다.
성숙한 파이썬 라이브러리에서 볼 수있는 것은 공장이 자신이 만든 것과 분리되어 있다는 것입니다. 인코딩 (문자열, XML, JSON, YAML 등)은 다소간의 무작위 변경의 영향을 많이받습니다. 그러나 본질적인 것은 거의 변하지 않습니다.
두 가지 문제를 구분하십시오. 인코딩 및 표현은 가능한 한 주 및 행동에서 멀리 유지하십시오.
Pythonista는 "muuuuu" –
"나는 아마 ... 클래스의 초기화 ('__init__')를 사용하는 것"을 말한다 - 정말? 팩토리 메소드는 초기화가 아니라 생성/인스턴스화에 관한 메소드입니다. '__init__'가 호출 될 무렵에는 너무 늦었고, 객체는 만들어졌습니다. 어떤 클래스 생성자의 일부로 새로운 객체를 생성 할 때 영리한 팩토리 액션을하려고한다면'__init__'가 아니라'__new__'에 있어야합니다. – PaulMcG