天天看點

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

一、四個具體類繼承一個抽象類,各自實作抽象基類中的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,他們有着相關性,那麼就用一個工廠去建立它們,不要用多個工廠去建立。

如有錯誤或不足歡迎評論指出!創作不易,轉載請注明出處。如有幫助,記得點贊關注哦(⊙o⊙)

更多内容請關注個人部落格:https://blog.csdn.net/qq_43148810

繼續閱讀