天天看点

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

继续阅读