소프트웨어에서는 때때로 객체의 생성과 사용을 분리해야하며, 그런 다음 간단한 팩토리 패턴이 필요합니다.
1. 간단한 팩토리 패턴의 세 가지 역할
1) 팩토리 역할 : 모든 인스턴스를 생성하는 내부 논리를 구현하는 간단한 팩토리 패턴의 핵심입니다. 팩토리 클래스는 필요한 제품 객체를 생성하기 위해 외부 세계에서 직접 호출 할 수 있습니다.
2) 추상 제품 (AbstractProduct) 역할 : 모든 인스턴스가 공유하는 공통 인터페이스를 설명하는 간단한 팩토리 패턴에 의해 생성 된 모든 객체의 상위 클래스입니다.
3) 구체적인 제품 역할 : 단순 공장 모델에 의해 생성 된 구체적인 인스턴스 개체입니다.
2. 적용 가능한 시나리오
1) 팩토리 클래스는 더 적은 수의 객체를 생성하는 역할을하며, 생성되는 객체가 적기 때문에 팩토리 메소드의 비즈니스 로직은 너무 복잡하지 않습니다.
2) 클라이언트는 팩토리 클래스에 전달 된 매개 변수 만 알고 있으며 개체를 만드는 방법에 대해서는 신경 쓰지 않습니다.
3. 팩토리 모델의
장점 과 단점 1) 장점
1.1) 객체 생성과 사용의 분리 실현
1.2) 특정 클래스 이름을 기억할 필요가없고 매개 변수 만 기억하면 사용자의 메모리 부담이 줄어 듭니다.
2) 단점 :
2.1) 공장 범주에 대한 과도한 책임, 일단 작동하지 않으면 시스템에 영향을줍니다.
2.2) 시스템의 범주 수를 늘리고 복잡성과 이해를 높이십시오.
2.3) "개방 및 폐쇄 원칙"위반, 신제품 추가 공장 로직을 수정해야하며 공장은 점점 더 복잡해지고 있습니다.
네, 케이스
4.1 오리지널 디자인 ver1.1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
class Fruit
{
public:
Fruit(string kind){
if (this->kind == "apple")
{
}
else if (this->kind == "banana")
{
}
}
void getName(){
if (this->kind == "apple")
{
cout << "I am apple" << endl;
}
else if (this->kind == "banana")
{
cout << "I am banana" << endl;
}
}
private:
string kind; //水果的种类
};
//工厂模式的目的,就是让业务层和类的构造函数之间解耦合,
//尽量降低一个类的复杂度
int main(void)
{
//要一个苹果
Fruit apple("apple");
apple.getName();
Fruit banana("banana");
banana.getName();
return 0;
}
4.2) 단순 공장 모드가 추가 된 디자인 ver1.2
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//水果类
class Fruit
{
public:
virtual void getName() = 0;
};
class Apple :public Fruit
{
public:
virtual void getName(){
cout << "apple..." << endl;
}
};
class Banana :public Fruit
{
public:
virtual void getName(){
cout << "banana..." << endl;
}
};
//一个工厂
class Factory
{
public:
//水果的生产器
Fruit* createFruit(string kind){
if (kind == "apple")
{
return new Apple;
}
else if (kind == "banana")
{
return new Banana;
}
}
};
int main(void)
{
Factory *factory = new Factory;
//要一个苹果
Fruit *apple = factory->createFruit("apple");
apple->getName();
//要香蕉
Fruit *banana = factory->createFruit("banana");
banana->getName();
return 0;
}
버전 ver1.2는 ver1.1 코드보다 유지 관리 및 확장 성이 우수합니다.