공장 패턴 정의 : 객체 생성을위한 인터페이스를 제공합니다.
공장 모드를 사용하는 이유
공장 모델은 우리가 사용하는 가장 일반적으로 사용되는 모델입니다.
공장 모델이 왜 그렇게 일반적으로 사용됩니까? 공장 패턴은 새 인스턴스 객체를 만드는 것과 동일하기 때문에 클래스 클래스를 기반으로 인스턴스 객체를 생성해야합니다. 더 조심해야합니다. 실용적인 공장 모델을 고려할 수 있습니까?
샘플의 인스턴스 객체를 만들려면 샘플 클래스를 예로 들어 보겠습니다.
코드 사본은 다음과 같습니다.
샘플 샘플 = 새로운 샘플 ();
그러나 현실은 과제 쿼리 데이터베이스 등과 같은 샘플 인스턴스를 생성 할 때 일반적으로 일부 초기화 작업을 수행한다는 것입니다.
우선, 우리가 생각하는 것은 샘플의 생성자를 사용할 수 있으므로 인스턴스가 생성되고 작성되도록합니다.
코드 사본은 다음과 같습니다.
샘플 샘플 = 새로운 샘플 (매개 변수);
그러나 샘플 인스턴스를 만들 때 수행 된 초기화 작업이 할당만큼 간단하지 않으면 코드가 생성자에 기록되면 코드가 추악 할 수 있습니다 (Refactor 재구성이 필요합니다).
코드가 추악한 이유는 무엇입니까? 방법은 많은 계란을 넣는 것과 같습니다. 바구니에 매우 위험합니다. 긴 코드가 각 세그먼트로 발송하면 세그먼트가 다시 "캡슐화"되어 (세그먼트 간의 결합 연결을 줄이면) 위험이 다르면 각 세그먼트를 변경하면 각 세그먼트를 변경하십시오. 더 이상 각 세그먼트에 영향을 미치는 것들이 없습니다.
이 예에서 먼저 인스턴스를 사용하는 작업에서 인스턴스를 작성하는 작업을 분리해야합니다. 즉, 샘플 생성자로부터 인스턴스를 생성하는 데 필요한 많은 양의 초기화 작업을 분리해야합니다.
현재 객체를 생성하려면 공장 공장 패턴이 필요하며 더 이상 간단한 새 샘플 (매개 변수)을 사용할 수 없습니다. 또한 샘플에 인터페이스 지향 프로그래밍에 따라 마이 샘플과 같은 상속이있는 경우 샘플을 인터페이스로 추상화해야합니다. 이제 샘플은 두 개의 서브 클래스 마이 샘플과 히스 샘플이있는 인터페이스입니다. 다음과 같이 인스턴스화하고 싶을 때 :
코드 사본은 다음과 같습니다.
샘플 mysample = new MySample ();
프로젝트가 심화됨에 따라 샘플은 "많은 아들들을 가져 오십시오". 우리는이 아들들을 하나씩 인스턴스화해야합니다 전통적인 프로그램에서는 피할 수 없습니다.
그러나 처음부터 의식적으로 공장 모델을 사용한다면 이러한 문제는 사라졌습니다.
공장 방법
샘플 인스턴스 생산을 전문으로하는 공장을 구축합니다.
코드 사본은 다음과 같습니다.
공공 수업 공장 {
공개 정적 샘플 제작자 (int) {
// getclass 샘플 생성 일반적으로 일반적으로 동적 클래스로드를 사용하여 클래스를로드 할 수 있습니다.
if (who == 1)
새로운 Samplea ()를 반환합니다.
else if (who == 2)
새 sampleb ()를 반환합니다.
}
}
그런 다음 프로그램에서 샘플을 인스턴스화하려면 다음과 같이 사본 코드 코드를 사용하십시오.
샘플 샘플 리 = 공장 .Creator (1);
이러한 방식으로, 샘플의 특정 서브 클래스는 전체 프로세스에 관여하지 않으며,이 원칙은 매우 인기있는 방식으로 비교할 수 있습니다. 실수를하기가 더 쉬워집니다. 특정 작업을 수행 한 모든 사람은 이에 대한 깊은 이해를 가지고 있습니다. 우리는 또한 프로그래밍에서 삶의 원리를 이해할 수 있습니까?
공장 방법을 사용하여 여러 역할에주의를 기울이면 샘플과 같은 샘플 인터페이스와 같은 제품 인터페이스를 정의해야합니다. 맨 오른쪽 그림과 같이 제품 샘플을 생성하는 것은 생산 객체 샘플입니다.
더 복잡하기 위해서는 공장 클래스를 확장하는 것이며, 이는 구현 클래스 ConcreteFactory를 물려받는 것입니다.
초록 공장
공장 모델에는 공장 방법 및 추상 공장이 포함됩니다.
이 두 패턴의 차이점은 물체 생성의 복잡성에 있습니다. 위의 공장 방법에서와 같이 객체 생성 방법이 복잡해지면 새로운 제품 인터페이스 샘플이있는 경우 객체 샘플을 작성하는 것입니다.
샘플에는 두 개의 콘크리트 클래스 샘플 리아 및 Samleb이 있으며 Sample2에는 두 개의 콘크리트 클래스 샘플 2a 및 SampleB2가 있습니다. 다른 부품 서브 클래스 구현, 다음은 위의 예에서 공장을 추상 공장으로 확장하는 것입니다.
코드 사본은 다음과 같습니다.
공개 초록 수업 공장 {
공개 추상 샘플 제작자 ();
공개 초록 샘플 2 Creator (문자열 이름);
}
공개 클래스 Simplefactory 확장 공장 {
공개 샘플 Creator () {......... Return New Samplea}}
public sample2 creator (문자열 이름) {......... 새로운 샘플을 반환
}
공개 클래스 폭탄 Factory는 공장을 확장합니다.
공개 샘플 creator () {...... 새로운 SampleB} 반환}
public sample2 Creator (String Name) {...... 새로운 Sample2B} 반환}
}
위에서, 두 공장은 각각 일련의 샘플과 샘플을 생성합니다. 아마도 두 공장 방법을 사용하여 샘플과 샘플을 각각 생산할 수 없습니까?
추상 공장에는 샘플과 샘플을 생성하는 방법 사이에 특정한 연결이 있기 때문에이 두 가지 방법은 하나의 클래스에 묶여 있어야합니다 예를 들어 프로세스는 통합됩니다. 제조 공정은 비교적 간단하므로 이름은 단순합니다.
실제 응용 분야에서 공장 방법은 더 자주 사용되며 동적 클래스 로더와 결합됩니다.
Java Factory 모델의 예
Jive의 ForumFactory를 예로 들어 보겠습니다.이 예제는 이전 싱글 톤 모드에서 논의했습니다.
코드 사본은 다음과 같습니다.
공개 초록 수업 포럼 factory {
개인 정적 객체 initLock = 새 개체 ();
공개 정적 포럼 Factory GetInstance (승인 승인) {
// 유효한 승인이 통과되지 않으면 NULL을 반환하십시오.
if (supperization == null) {return null}
// 다음은 싱글 톤 싱글 톤 모드를 사용합니다
if (factory == null) {
동기화 된 (initlock) {
if (factory == null) {......
노력하다 {
// 동적 재 인쇄
클래스 c = class.forname (className);
Factory = (ForumFactory) C.NewInstance ();
} catch (예외 e) {return null}
}
}
}
// 이제 포럼에 대한 승인 된 액세스를 제한하는 데 사용됩니다
새로운 ForumFactoryProxy를 반환합니다 (승인, 공장, 공장 .getPermissions (승인));
}
// 포럼 생성 방법은 포럼 변동을 상속하는 서브 클래스로 완료됩니다.
공개 초록 포럼 CreateForum (문자열 이름, 문자열 설명)
무단 exception, ForumAlreadyExistSexception을 던집니다.
.... ....
}
Jive는 이제 데이터베이스 시스템을 통해 포럼 게시물 및 기타 컨텐츠 데이터를 저장하기 때문에 파일 시스템을 통해 구현하도록 변경하려면이 공장 메소드 ForumFactory가 동적 인터페이스를 제공합니다.
코드 사본은 다음과 같습니다.
private static string className = "com.jiveSoftware.forum.database.dbforumFactory";
개발 한 방법을 사용하여 com.jivesoftware.forum.database.dbforumfactory 대신 포럼을 만들 수 있습니다.
위의 코드에는 공장 모드 외에도 3 가지 모드가 있습니다. 액세스 포럼 : 등록 된 사용자 및 게스트 인 경우 해당 권한이 다르고이 권한은 전체 시스템을 통해 실행되므로 게이트웨이 개념과 유사 하게이 효과를 잘 달성 할 수 있습니다.
Java Pet Store에서 Catalogdaofactory를 확인하십시오.
코드 사본은 다음과 같습니다.
공개 클래스 카탈로그 다코 팩토리 {
/**
*이 방법은 DAO 패턴을 구현하기위한 특수 하위 클래스를 개발합니다.
* 특정 서브 클래스 정의는 J2EE 배포 디스크립터에 있습니다.
*/
public static catalogdao getdao ()는 카탈로그 도시스 섹스를 던졌습니다.
Catalogdao catdao = null;
노력하다 {
InitialContext IC = New InitialContext ();
// 카탈로그의 동적로드 _dao_class
// 너무 많은 코드를 변경할 필요가 없도록 자신의 카탈로그를 정의 할 수 있습니다.
// 거대한 시스템 변경을 완료하십시오.
문자열 className = (string) ic.Lookup (jndinames.catalog_dao_class);
catdao = (Catalogdao) class.forname (classname) .newinstance ();
} catch (namingexception ne) {
새로운 CatalogdaosySexception을 던지십시오 ( "Catalogdaofactory.getDao : dao 유형을 얻는 동안 namingexception : /n" + ne.getMessage ());
} catch (예외 SE) {
새로운 CatalogdaosySexception을 던지십시오.
}
반환 catdao;
}
}
Catalogdaofactory는 전형적인 공장 방법입니다. CATDAO는 동적 클래스 로더 클래스 이름을 통해 카탈로그 다치 구현 서브 클래스를 얻습니다. . 서브 클래스를 구현하고 자신의 서브 클래스 이름을 Catalog_DAO_CLASS 변수에 제공하십시오.
공장 방법은 특정 공장 방법을 변경하는 한 시스템 구조에 매우 유연하고 강력한 동적 확장 메커니즘을 제공한다는 것을 알 수 있습니다. 변환에서 시스템 기능을 변경할 수 있습니다.