一、四個具體類繼承一個抽象類,各自實作抽象基類中的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