@著作權歸作者所有:來自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