创建型模式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

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