1. 程式人生 > >Simple Factory Pattern--簡單工廠模式

Simple Factory Pattern--簡單工廠模式

介紹:簡單工廠模式不能說是一個設計模式,說它是一種程式設計習慣可能更恰當些。因為它至少不是Gof23種設計模式之一。但它在實際的程式設計中經常被用到,而且思想也非常簡單,可以說是工廠方法模式的一個引導。

動機:當你需要什麼,只需要傳入一個正確的引數,就可以獲取你所需要的物件,而無須知道其建立細節


定義:簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

優缺點

優點:實現物件的建立和物件的使用分離,將物件的建立交給專門的工廠類負責。

缺點:工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯程式碼,而且產品較多時,工廠方法程式碼將會非常複雜。

使用場合:工廠類負責建立的物件比較少:由於建立的物件較少,不會造成工廠方法中的業務邏輯太過複雜。

舉例如下:

對於一個只擁有加減乘除運算的簡單計算器,我們設計一個Operation的父類,並構造加減乘除四個類繼承父類重寫運算函式

GetResult。然後定義工廠類中的工廠函式,其根據使用者的輸入new出相應的物件例項並返回其父類的指標。

UML圖如下所示:


注意智慧指標的使用,可以防止資源洩露

#include<iostream>  
#include<memory>  
using namespace std;

class Operation
{
private:
	double n1, n2;
public:
	double GetN1() const { return n1; }
	double GetN2() const { return n2; }
	void SetN1(double x) { n1 = x; }
	void SetN2(double y) { n2 = y; }
	virtual double GetResult() = 0;
};

class Add : public Operation {
public:
	double GetResult() override {
		return GetN1() + GetN2();
	}
};

class Sub : public Operation {
public:
	double GetResult() override {
		return GetN1() - GetN2();
	}
};

class Mul : public Operation
{
public:
	double GetResult() override {
		return GetN1()*GetN2();
	}
};

class Div : public Operation
{
public:
	double GetResult() override {
		return GetN1() / GetN2();
	}
};

class SimpleFactory
{
public:
	static Operation* CreateOpeartor(char ch) {
		Operation * p;
		switch (ch) {
		case '+':
			p = new Add();
			break;
		case '-':
			p = new Sub();
			break;
		case '*':
			p = new Mul();
			break;
		case '/':
			p = new Div();
			break;
		default:
			p = nullptr;
		}
		return p;
	}
};

int main() {
	double a = 0;
	double b = 0;
	char ch = '\0';
	cin >> a >> ch >> b;

	//使用智慧指標,防止資源洩露
	shared_ptr<Operation> op(SimpleFactory::CreateOpeartor(ch));
	op->SetN1(a);
	op->SetN2(b);
	cout << op->GetResult() << endl;
}

參考:

1.https://www.cnblogs.com/jostree/p/4251756.html

2.https://www.cnblogs.com/Bobby0322/p/4178412.html