소프트웨어의 간단한 공장 모델

        소프트웨어에서는 때때로 객체의 생성과 사용을 분리해야하며, 그런 다음 간단한 팩토리 패턴이 필요합니다.
        1. 간단한 팩토리 패턴의 세 가지 역할
        1) 팩토리 역할 : 모든 인스턴스를 생성하는 내부 논리를 구현하는 간단한 팩토리 패턴의 핵심입니다. 팩토리 클래스는 필요한 제품 객체를 생성하기 위해 외부 세계에서 직접 호출 할 수 있습니다.
        2) 추상 제품 (AbstractProduct) 역할 : 모든 인스턴스가 공유하는 공통 인터페이스를 설명하는 간단한 팩토리 패턴에 의해 생성 된 모든 객체의 상위 클래스입니다.
        3) 구체적인 제품 역할 : 단순 공장 모델에 의해 생성 된 구체적인 인스턴스 개체입니다.
여기에 사진 설명 삽입

그림 (1) 간단한 공장 패턴의 UML 다이어그램

        2. 적용 가능한 시나리오
        1) 팩토리 클래스는 더 적은 수의 객체를 생성하는 역할을하며, 생성되는 객체가 적기 때문에 팩토리 메소드의 비즈니스 로직은 너무 복잡하지 않습니다.
        2) 클라이언트는 팩토리 클래스에 전달 된 매개 변수 만 알고 있으며 개체를 만드는 방법에 대해서는 신경 쓰지 않습니다.
        3. 팩토리 모델의
        장점 과 단점 1) 장점
        1.1) 객체 생성과 사용의 분리 실현
        1.2) 특정 클래스 이름을 기억할 필요가없고 매개 변수 만 기억하면 사용자의 메모리 부담이 줄어 듭니다.
        2) 단점 :
        2.1) 공장 범주에 대한 과도한 책임, 일단 작동하지 않으면 시스템에 영향을줍니다.
        2.2) 시스템의 범주 수를 늘리고 복잡성과 이해를 높이십시오.
        2.3) "개방 및 폐쇄 원칙"위반, 신제품 추가 공장 로직을 수정해야하며 공장은 점점 더 복잡해지고 있습니다.
        네, 케이스
여기에 사진 설명 삽입

그림 (2) 과일에 대한 간단한 공장 패턴의 UML 다이어그램

        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 코드보다 유지 관리 및 확장 성이 우수합니다.

추천

출처blog.csdn.net/sanqima/article/details/105329092