设计模式(七)——对象创建模式-Factory method

对象模式所属类别简介-对象创建模式

对象创建模式-通过对象创建模式绕开对象创建new,避免new导致的紧耦合。典型模式有factory method,abstract method,prototype,builder

当前模式简介-Factory method

factory method工厂模式

需求

设计一个文件分割器。当前文件类型只有二进制文件。点击按钮即可分割。

设计一

#include "stdafx.h"
#include <iostream>
using namespace std;

//filespitter.cpp
class CFileSplitter
{
public:
	void SpliteFile(){ std::cout << "SpliteFile" << std::endl;}
};

class CMainForm
{
public:
	void bottomClick(){
		CFileSplitter *splitter = new CFileSplitter;
		splitter->SpliteFile();
	}
};

int main() //调用
{
	CMainForm main;
	main.bottomClick();
	return 0;
}

需求更改

添加多种分割方式,二进制文件,图片,视频

设计一更改版本

#include "stdafx.h"
#include <iostream>
using namespace std;

//filespitter.cpp
class CFileSplitter
{
public:
	virtual ~CFileSplitter(){}
	virtual void SpliteFile() = 0;
};

class CPictureFile : public CFileSplitter
{
public:
	virtual void SpliteFile() { std::cout << "CPictureFile splitter" << std::endl; }
};

class CBinaryFile : public CFileSplitter
{
public:
	virtual void SpliteFile() { std::cout << "CBinaryFile splitter" << std::endl; }
};

class CvedioFile : public CFileSplitter
{
public:
	virtual void SpliteFile() { std::cout << "CvedioFile splitter" << std::endl; }
};

class CMainForm
{
public:
	void bottomClick()
	{
		CFileSplitter *splitter = new CvedioFile;
		splitter->SpliteFile();
	}
};

int main() //调用
{
	CMainForm main;
	main.bottomClick();
	return 0;
}
//打印
CvedioFile splitter

违反原则

1.设计一更改版本36行违反设计模式原则一新建类要抽象原则,面对接口编程而不是实现。类声明要抽象,类创建也要抽象。
2.违反重构e原则,依赖具体类型对象会导致紧耦合

设计二

设计二更改版本

版本一

34行new CVedioFile; //new还是依赖具体的类
#include "stdafx.h"
#include <iostream>
using namespace std;

class ISplitter
{
public:
	virtual ~ISplitter(){}
	virtual void splitter() = 0;

};

class CBanaryFile : public ISplitter
{
public:
	virtual void splitter() { std::cout << "CBanaryFile" << std::endl; }
};
class CVedioFile : public ISplitter
{
public:
	virtual void splitter() { std::cout << "CVedioFile" << std::endl; }
};
class CPictureFile : public ISplitter
{
public:
	virtual void splitter() { std::cout << "CPictureFile" << std::endl; }
};
class CMainForm
{
public:

	void BottomClick()
	{
		ISplitter *splinter = new CVedioFile; //new还是依赖具体的类
		splinter->splitter();
	}
};

int main() //调用
{
	CMainForm main;
	main.BottomClick();
	return 0;
}

版本二

#include "stdafx.h"
#include <iostream>
using namespace std;

class ISplitter
{
public:
	virtual ~ISplitter(){}
	virtual void splitter() = 0;

};

class CBanaryFile : public ISplitter
{
public:
	virtual void splitter() { std::cout << "CBanaryFile" << std::endl; }
};
class CVedioFile : public ISplitter
{
public:
	virtual void splitter() { std::cout << "CVedioFile" << std::endl; }
};
class CPictureFile : public ISplitter
{
public:
	virtual void splitter() { std::cout << "CPictureFile" << std::endl; }
};
//
class ISplitterFactory
{
public:
	virtual ISplitter* CreateSplitter() = 0;
};

class CBanaryFileFactory : public ISplitterFactory
{
public:
	virtual ISplitter* CreateSplitter() { return new CBanaryFile; }
};

class CVedioFileFactory : public ISplitterFactory
{
public:
	virtual ISplitter* CreateSplitter() { return new CVedioFile; }
};

class CPictureFileFactory : public ISplitterFactory
{
public:
	virtual ISplitter* CreateSplitter() { return new CPictureFile; }
};
///
class CMainForm
{
public:
	ISplitterFactory *m_factory;//写到属性而不直接new是因为每次点击buttom可以指向不同的对象。如果写到bottom还要传递进来,一般触发bottom没有传递东西
	CMainForm(ISplitterFactory *factory){ this->m_factory = factory; }
	void BottomClick()
	{
		ISplitter *splinter = m_factory->CreateSplitter(); //多态new
		splinter->splitter();
	}
};

int main() //调用
{
	CMainForm main(new CVedioFileFactory);
	main.BottomClick();
	return 0;
}
//打印
CVedioFile

设计二比设计一区别

虚函数 延迟到运行再写Splitter
整个过程还是要new,只是new换了位置。设计是一只喵,还是要传入具体对象到mainform,如同把杂乱的具体new赶到笼子里,而不是让他跳来跳去,无法消灭,只是转移。

模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个。如 继承的类里面自己new
延迟了到子类实例化。用到了虚函数来解藕

结构图

在这里插入图片描述

要点总结

工厂模式隔离类对象使用者和该对象具体类型和耦合关系。
工厂模式眼迟到了子类创建对象,从而实现解藕。
工厂模式缺点是要求创建对象参数都要相同。如果文件分割需要传入文件大小,图片分割还要传入像素,那么就不适用工厂模式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值