[디자인 모델] 뇌봉 은 여전히 인간 세상 에 있다 - 공장 방법 모델

개술
           공장 방법 (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; 
} 


 
 

좋은 웹페이지 즐겨찾기