軟件裏的簡單工廠模式

        軟件中,有時需要將對象的創建與使用分離,這時就需要簡單工廠模式了。
        一、簡單工廠模式的三個角色
        1)工廠(Factory)角色: 簡單工廠模式的核心,它負責實現創建所有的實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。
        2)抽象產品(AbstractProduct)角色:簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
        3)具體產品(Concrete Product)角色:簡單工廠模式所創建的具體實例對象。
在這裏插入圖片描述

圖(1) 簡單工廠模式的UML圖

        二、適用場景
        1)工廠類負責創建的對象比較少,由於創建的對象比較少,不會造成工廠方法中的業務邏輯太過複雜。
        2)客戶端只知道傳入工廠類的參數,對於如何創建對象並不關心。
        三、工廠模式的優缺點
        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代碼的可維護性、可擴展性要好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章