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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大胡子的艾娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值