創建型模式Creational Patterns之工廠模式factory method

@著作權歸作者所有:來自CSDN博客作者大鬍子的艾娃的原創作品,如需轉載,請註明出處https://blog.csdn.net/qq_43148810,否則將追究法律責任。
如有錯誤的地方歡迎指正,謝謝!

一、四個具體類繼承一個抽象類,各自實現抽象基類中的split()方法、類內(也可放到類外)工廠類實現創建方法。單一責任原則,各自類各自實現自己的方法(split()、CreateSplitter)。

#pragma once
#include <iostream>

//抽象類
class ISplitter
{
public:
	virtual void split() = 0;
	virtual ~ISplitter() {}

	//工廠基類
	class IFactory 
	{
	public:
		virtual ISplitter* CreateSplitter() = 0;
		virtual ~IFactory() {}
	};
};



//具體類1
class BinarySplitter : public ISplitter 
{
public:
	//具體工廠
	class Factory : public IFactory
	{
	public:
		virtual ISplitter* CreateSplitter() {
			return new BinarySplitter();
		}
	};

	void split()
	{
		std::cout << "類1\n";
	};
};

//具體類2
class TxtSplitter : public ISplitter
{
public:
	//具體工廠
	class Factory : public IFactory
	{
	public:
		virtual ISplitter* CreateSplitter() {
			return new TxtSplitter();
		}
	};

	void split()
	{
		std::cout << "類2\n";
	};
};

//具體類3
class PictureSplitter : public ISplitter
{
public:
	//具體工廠
	class Factory : public IFactory {
	public:
		virtual ISplitter* CreateSplitter() {
			return new PictureSplitter();
		}
	};

	void split()
	{
		std::cout << "類3\n";
	};
};

//具體類4
class VideoSplitter : public ISplitter
{
public:
	class Factory : public IFactory {
	public:
		virtual ISplitter* CreateSplitter() {
			return new VideoSplitter();
		}
	};

	void split() 
	{
		std::cout << "類4\n";
	};
};

二、on_Button_Click函數中等號左邊的多態new一個抽象ISplitter*對象,多種split()實現方法;而等號右邊的多態new將根據factory指向具體對象的不同,動態的通過虛方法CreateSplitter()創建ISplitter具體子類對象,而不直接顯示的創建ISplitter具體子類對象(可能一會要創建這種對象,一會需要創建那種對象),從而將變化點隔離。達到MainForm只依賴ISplitter和ISplitter::IFactory,從而實現MainForm的穩定,變化點隔離到用戶對MainForm構造傳參。並且在MainForm類中可以調用ISplitter接口的多個方法進行組合實現不同的算法,從而設計成不同的函數。

#pragma once
#include "Splitters.h"
class MainForm
{
private:
	ISplitter* splitter;				//多態new

public:
	MainForm(ISplitter::IFactory*  factory)
	{
		splitter =
			factory->CreateSplitter(); //多態new
	}

	void on_Button_Click()
	{
		splitter->split();
	}
};

三、變化點隔離到用戶對MainForm實例化。

#include <iostream>
#include "Splitters.h"
#include "MainForm.h"

int main()
{
	BinarySplitter::Factory BSF;
	MainForm form1(&BSF);
	form1.on_Button_Click();

	VideoSplitter::Factory VSF;
	MainForm form4(&VSF);
	form4.on_Button_Click();
}

總結:splitter = factory->CreateSplitter(); //多態new是工程模式的核心思想,左邊通過虛方法實現單一責任原則。在MainForm類中可以調用ISplitter接口的多個方法進行組合實現不同的算法,從而設計成不同的函數,並且MainForm類是穩定的。

四、抽象工廠拓展
抽象工廠本質和簡單工廠沒什麼區別,抽象是指需要創建多個有關聯的對象,例如:創建對象A後,才能用A去創建B,他們有着相關性,那麼就用一個工廠去創建它們,不要用多個工廠去創建。

更多內容請關注個人博客:https://blog.csdn.net/qq_43148810

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