원래 책 Design Patterns에서는 많은 디자인 패턴에서 느슨한 결합 사용을 권장합니다. 이 개념을 이해하려면 많은 개발자가 대규모 시스템에서 작업하면서 겪는 힘든 여정에 대해 이야기하는 것이 가장 좋습니다. 코드 중 하나를 변경하면 문제가 발생할 수 있으며 시스템의 다른 부분(한때 전혀 관련이 없다고 생각했던 부분)에서 계단식 중단이 발생할 수 있습니다.
문제는 긴밀한 결합입니다. 시스템의 한 부분에 있는 함수와 클래스는 시스템의 다른 부분에 있는 함수와 클래스의 동작과 구조에 크게 의존합니다. 이러한 클래스가 서로 통신할 수 있도록 하는 패턴 세트가 필요하지만 연동을 피하기 위해 클래스를 단단히 묶고 싶지는 않습니다.
대규모 시스템에서는 많은 코드가 몇 가지 주요 클래스에 의존합니다. 이러한 클래스를 변경해야 할 때 어려움이 발생할 수 있습니다. 예를 들어 파일에서 읽는 User 클래스가 있다고 가정합니다. 데이터베이스에서 읽는 다른 클래스로 변경하려고 하지만 모든 코드는 파일에서 읽는 원래 클래스를 참조합니다. 이때는 공장모드를 이용하시면 매우 편리합니다.
팩토리 패턴은 객체를 생성하는 특정 메소드를 포함하는 클래스입니다. new를 직접 사용하지 않고도 팩토리 클래스를 사용하여 객체를 생성할 수 있습니다. 이렇게 하면 생성된 객체의 유형을 변경하려면 팩토리만 변경하면 됩니다. 이 팩토리를 사용하는 모든 코드는 자동으로 변경됩니다.
예제 1: 팩토리 클래스의 열을 표시합니다. 방정식의 서버 측은 피드백을 추가하고, 피드백 목록을 요청하고, 특정 피드백과 관련된 기사를 얻을 수 있는 데이터베이스와 PHP 페이지 세트라는 두 부분으로 구성됩니다.
interface IUser { function getName(); } class User implements IUser { public function __construct( $id ) { } public function getName() { return "Jack"; } } class UserFactory { public static function Create( $id ) { return new User( $id ); } } $uo = UserFactory::Create( 1 ); echo( $uo->getName()."\n" ); ?>
IUser 인터페이스는 사용자 개체가 수행해야 하는 작업을 정의합니다. IUser의 구현을 User라고 하며 UserFactory 팩토리 클래스는 IUser 객체를 생성합니다. 이 관계는 그림 1의 UML로 표현될 수 있습니다.
그림 1. 팩토리 클래스와 관련 IUser 인터페이스 및 사용자 클래스
php 인터프리터를 사용하여 명령줄에서 이 코드를 실행하면 다음과 같은 결과가 나타납니다. get 다음 결과:
% php factory1.php Jack %
테스트 코드는 팩토리에서 User 개체를 요청하고 getName 메서드의 결과를 출력합니다.
팩토리 메소드를 사용하는 팩토리 패턴의 변형이 있습니다. 클래스의 이러한 공용 정적 메서드는 해당 유형의 개체를 구성합니다. 이 방법은 이 유형의 객체를 생성하는 것이 중요한 경우 유용합니다. 예를 들어, 먼저 개체를 만든 다음 여러 속성을 설정해야 한다고 가정해 보겠습니다. 이 버전의 팩토리 패턴은 프로세스를 단일 위치에 캡슐화하므로 복잡한 초기화 코드를 복사하여 코드 베이스 전체에 붙여넣을 필요가 없습니다.
예제 2에서는 팩토리 메소드를 사용하는 예를 보여줍니다.
interface IUser { function getName(); } class User implements IUser { public static function Load( $id ) { return new User( $id ); } public static function Create( ) { return new User( null ); } public function __construct( $id ) { } public function getName() { return "Jack"; } } $uo = User::Load( 1 ); echo( $uo->getName()."\n" ); ?>
이 코드는 훨씬 간단합니다. 여기에는 인터페이스 IUser와 이 인터페이스를 구현하는 User 클래스가 하나만 있습니다. User 클래스에는 객체를 생성하기 위한 두 가지 정적 메서드가 있습니다. 이 관계는 그림 2의 UML로 표현될 수 있습니다.
그림 2. 팩토리 메소드를 사용하는 IUser 인터페이스 및 사용자 클래스
명령줄에서 스크립트를 실행하면 아래 표시된 대로 목록 1과 동일한 결과가 생성됩니다. :
% php factory2.php Jack %
위에서 언급했듯이 때로는 이러한 모드가 소규모 환경에서 과도하게 보일 수 있습니다. 그러나 모든 규모의 프로젝트에 적용할 수 있는 견고한 형태의 코딩을 배우는 것이 가장 좋습니다.
PHP 디자인 패턴 Talk Factory Pattern에 관한 더 많은 글은 PHP를 주목해주세요 중국사이트!