一、四个具体类继承一个抽象类,各自实现抽象基类中的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.youkuaiyun.com/qq_43148810