[디자인 모델] 뇌봉 은 여전히 인간 세상 에 있다 - 공장 방법 모델
공장 방법 (Factory Method) 모델 의 의 미 는 제품 대상 을 만 드 는 공장 인 터 페 이 스 를 정의 하고 실제 생 성 작업 을 하위 클래스 로 미 루 는 것 이다.핵심 공장 류 는 제품 의 설립 을 책임 지지 않 는 다. 이런 핵심 류 는 추상 적 인 공장 역할 이 되 고 구체 적 인 공장 서브 류 가 반드시 실현 해 야 하 는 인터페이스 만 책임 진다. 이렇게 추상 화 된 장점 은 공장 방법 모델 로 하여 금 시스템 이 구체 적 인 공장 역할 을 수정 하지 않 은 상황 에서 새로운 제품 을 도입 하 게 하 는 것 이다.
공장 방법 모델 은 간단 한 공장 모델 의 파생 으로 많은 간단 한 공장 모델 의 문 제 를 해결 했다.
먼저 '개 - 폐 원칙' 을 완전히 실현 하여 확장 가능 한 것 을 실현 했다.
그 다음으로 더욱 복잡 한 차원 구 조 는 제품 결과 가 복잡 한 장소 에 응용 할 수 있다.
공장 방법 모델 은 간단 한 공장 모델 에 대해 추상 화 되 었 다.추상 적 인 Factory 류 (추상 류 와 인터페이스 일 수 있 음) 가 있 는데 이런 류 는 구체 적 인 제품 생산 을 책임 지지 않 고 규범 만 제정 하고 구체 적 인 생산 업 무 는 그 하위 류 에 의 해 이 루어 질 것 이다.이 모델 에서 공장 류 와 제품 류 는 종종 순서대로 대응 할 수 있다.즉, 추상 적 인 공장 은 추상 적 인 제품 에 대응 하고 구체 적 인 공장 은 구체 적 인 제품 에 대응 하 며 이 구체 적 인 공장 은 해당 하 는 제품 을 생산 하 는 것 을 책임 진다.
공장 방법 모델 (Factory Method pattern) 은 가장 전형 적 인 템 플 릿 방법 모델 (Templete Method pattern) 응용 이다.
2. 공장 방법 모델 의 역할 과 구조 추상 적 인 공장 (Creator) 역할: 공장 방법 모델 의 핵심 으로 응용 프로그램 과 무관 하 다.모드 에서 만 든 대상 의 공장 류 는 이 인 터 페 이 스 를 실현 해 야 합 니 다.
구체 적 인 공장 (Concrete Creator) 역할: 추상 적 인 공장 인 터 페 이 스 를 실현 하 는 구체 적 인 공장 류 로 응용 프로그램 과 밀접 한 관 계 를 가 진 논 리 를 포함 하고 응용 프로그램 에 의 해 호출 되 어 제품 대상 을 만 듭 니 다.위의 그림 에서 두 가지 역할 이 있 는데 그것 이 바로 BulbCreator 와 TubeCreator 이다.추상 적 인 제품 (Product) 역할: 공장 방법 모델 이 만 든 대상 의 초 유형, 즉 제품 대상 의 공동 아버지 류 또는 공동으로 가 진 인터페이스 이다.위의 그림 에서 이 역할 은 Light 이다.
구체 적 인 제품 (Concrete Product) 역할: 이 역할 은 추상 적 인 제품 캐릭터 가 정의 하 는 인 터 페 이 스 를 실현 했다.어떤 구체 적 인 제품 은 전문 적 인 구체 적 인 공장 이 설립 되 는데, 그들 사이 에는 종종 일일이 대응 된다.
셋째, 공장 방법 모델 의 응용 공장 방법 은 다음 과 같은 두 가지 상황 에 자주 사용 된다.
첫 번 째 상황 은 특정한 제품 에 대해 호출 자 는 어떤 구체 적 인 공장 서 비 스 를 사용 해 야 하 는 지 정확하게 알 고 이 구체 적 인 공장 을 예화 하여 구체 적 인 제품 을 생산 해 야 하 는 것 이다.자바 컬 렉 션 의 iterator () 방법 은 바로 이런 상황 에 속한다.
두 번 째 상황 은 한 가지 제품 이 필요 할 뿐 알 고 싶 지 않 고 도대체 어느 공장 이 생산 하 는 지 알 필요 가 없다. 즉, 최종 적 으로 어떤 구체 적 인 공장 을 선택 하 는 결정 권 이 생산자 측 에 있 는 지 알 필요 가 없다. 그들 은 현재 시스템 의 상황 에 따라 실제 적 으로 볼 수 있 습 니까?
넷 째, 예
우선 간단 한 공장 모델 에서 컴퓨터 의 예 를 참고 하여 간단 한 공장 모델 을 참고 한다.
다음 예 는 간단 한 공장 모델 에 대한 공장 업그레이드 방법 모델 이다.
대비:
간단 한 공장 모델 로 내용 을 추가 하려 면 소스 코드 를 변경 해 야 하 며 개방 - 폐쇄 원칙 에 부합 되 지 않 습 니 다.
공장 방법 모델 은 하위 클래스 만 늘 리 고 방법 을 바 꿀 필요 가 없다.
#include <iostream>
class Operation//
{
public:
Operation():m_numberA(0),m_numberB(0) // 0
{
};
Operation(double numberA, double numberB):m_numberA(numberA),m_numberB(m_numberB)
{
};
double getA()
{
return m_numberA;
};
void setA(double number)
{
m_numberA = number;
};
double getB()
{
return m_numberB;
};
void setB(double number)
{
m_numberB = number;
};
virtual double GetResult() //
{
return 0;
}
protected:
double m_numberA;
double m_numberB;
};
class OperationAdd :public Operation //
{
public:
double GetResult()
{
double result = 0;
result = m_numberA + m_numberB;
return result;
}
};
class OperationSub :public Operation
{
public:
double GetResult()
{
double result = 0;
result = m_numberA - m_numberB;
return result;
}
};
class OperationMul :public Operation
{
public:
double GetResult()
{
double result = 0;
result = m_numberA * m_numberB;
return result;
}
};
class OperationDiv :public Operation
{
public:
double GetResult()
{
double result = 0;
if ( m_numberB == 0 )
throw " ";
result = m_numberA / m_numberB;
return result;
}
};
class IFactory //
{
public:
virtual Operation* CreateOperation(void) = 0;
};
//
class AddFactory :public IFactory
{
public:
Operation* CreateOperation(void)
{
return new OperationAdd();
};
};
//
class SubFactory :public IFactory
{
public:
Operation* CreateOperation(void)
{
return new OperationSub();
};
};
//
class MulFactory :public IFactory
{
public:
Operation* CreateOperation(void)
{
return new OperationMul();
};
};
//
class DivFactory :public IFactory
{
public:
Operation* CreateOperation(void)
{
return new OperationDiv();
};
};
int main()
{
IFactory* operFactory = new AddFactory();
Operation* oper = operFactory->CreateOperation();
oper->setA(1);
oper->setB(2);
double result = oper->GetResult();
std::cout<<"result:"<<result<<"
";
delete operFactory;
delete oper;
return 0;
}
5. 뇌봉 사례 배우 기
1) 풋내기 1
#include <iostream>
using namespace std;
class leiFeng
{
public:
void Sweep()
{
cout<<" "<<endl;
}
void Wash()
{
cout<<" "<<endl;
}
void BuyRice()
{
cout<<" "<<endl;
}
};
class UnderGraduateStudent : public leiFeng
{
};
int main()
{
leiFeng *xueleifeng = new UnderGraduateStudent();
xueleifeng->Sweep();
xueleifeng->Wash();
xueleifeng->BuyRice();
delete xueleifeng ;
return 0;
}
2) 단순 공장 실현
단점: 제품 을 늘 리 려 면 simple Factory 류 를 변경 해 야 합 니 다.이것 은 개방 - 폐쇄 원칙 에 부합 되 지 않 는 다.
#include <iostream>
using namespace std;
class leiFeng
{
public:
void Sweep()
{
cout<<" "<<endl;
}
void Wash()
{
cout<<" "<<endl;
}
void BuyRice()
{
cout<<" "<<endl;
}
};
class UnderGraduateStudent : public leiFeng
{
};
class Volunteer : public leiFeng
{
};
class SimpleFactory
{
public:
static leiFeng* CreateLeiFeng(string type)
{
leiFeng *result;
if(type == " ")
result = new UnderGraduateStudent();
else if(type == " ")
result =new Volunteer();
return result;
}
};
int main()
{
SimpleFactory sfactory;
leiFeng *xueleifeng = sfactory.CreateLeiFeng(" ");
xueleifeng->Sweep();
xueleifeng->Wash();
xueleifeng->BuyRice();
delete xueleifeng;
return 0;
}
3) 공장 방법 모델 의 실현
단점: 한 제품 을 늘 릴 때마다 제품 공장 의 종 류 를 늘 려 야 한다.코드 양 을 늘 렸 습 니 다.
장점: 클래스 를 추가 하려 면 클래스 를 변경 할 필요 가 없고 코드 만 추가 해 야 합 니 다.
#include <iostream>
using namespace std;
class leiFeng
{
public:
void Sweep()
{
cout<<" "<<endl;
}
void Wash()
{
cout<<" "<<endl;
}
void BuyRice()
{
cout<<" "<<endl;
}
};
class UnderGraduateStudent : public leiFeng
{
};
class Volunteer : public leiFeng
{
};
class IFactory //
{
public:
virtual leiFeng* CreateLeiFeng()=0;
};
class UnderGraduateFactory : public IFactory
{
public:
leiFeng* CreateLeiFeng()
{
return new UnderGraduateStudent();
}
};
class VolunteerFactory : public IFactory
{
public:
leiFeng* CreateLeiFeng()
{
return new Volunteer();
}
};
int main()
{
IFactory *factory = new UnderGraduateFactory();
leiFeng *student= factory->CreateLeiFeng();
student->Sweep();
student->Wash();
student->BuyRice();
delete student;
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.