设计模式(八)——对象创建模式-Abstract method

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

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

当前模式简介

factory method是abstract method的特例,当只有一种产品情况下,只有一种产品类型的工厂。抽象工厂可以实现不同产品的不同工厂。

需求

设计一个文件分割器。当前文件类型只有二进制文件。点击按钮即可分割,点击另一个按钮实现合并。(相当于分割产品,合并产品)

设计一

需求更改

设计一更改版本

违反原则

设计二。

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

class IBuild;
class CBanaryFileB;
class CVedioFileB;
class CPictureFileB;
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 IBuild
{
public:
	virtual ~IBuild(){}
	virtual void build() = 0;

};

class CBanaryFileB : public IBuild
{
public:
	virtual void build() { std::cout << "CBanaryFile" << std::endl; }
};
class CVedioFileB : public IBuild
{
public:
	virtual void build() { std::cout << "CVedioFile" << std::endl; }
};
class CPictureFileB : public IBuild
{
public:
	virtual void build() { std::cout << "CPictureFile" << std::endl; }
};

class IBuildFactory
{
public:
	virtual IBuild* CreateBuild() = 0;
};

class CBanaryFileFactory2 : public IBuildFactory
{
public:
	virtual IBuild* CreateBuild() { return new CBanaryFileB; }
};

class CVedioFileFactory2 : public IBuildFactory
{
public:
	virtual IBuild* CreateBuild() { return new CVedioFileB; }
};

class CPictureFileFactory2 : public IBuildFactory
{
public:
	virtual IBuild* CreateBuild() { return new CPictureFileB; }
};

///////////////////////////////////////////
class CMainForm
{
public:
	ISplitterFactory *m_factory;
	CMainForm(ISplitterFactory *factory){ this->m_factory = factory; }
	void BottomClick()
	{
		ISplitter *splinter = m_factory->CreateSplitter(); //多态new
		splinter->splitter();
	}
	//无法实现,因为ISplitterFactory已经固定,因该使用IBuildFactory创建m_factory
	//void BottomClick1()
	//{
	//	IBuild *splinter = m_factory->CreateBuild(); 
	//	splinter->build();
	//}
};

///////合成//////////////////////////////////////////////////
int main() //调用
{
	CMainForm main(new CVedioFileFactory);
	main.BottomClick();
	//main.BottomClick1();
	return 0;
}

1.违法设计模式一针对接口而不是实现。111行ISplitterFactory *m_factory;
设计二更改版本

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

//合成产品
///////////合成//////////////////////
class IBuild
{
public:
	virtual ~IBuild(){}
	virtual void build() = 0;

};

class CBanaryFileB : public IBuild
{
public:
	virtual void build() { std::cout << "CBanaryFileB" << std::endl; }
};
class CVedioFileB : public IBuild
{
public:
	virtual void build() { std::cout << "CVedioFileB" << std::endl; }
};
class CPictureFileB : public IBuild
{
public:
	virtual void build() { std::cout << "CPictureFileB" << std::endl; }
};
//合成产品

//分割产品
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 IFactory
{
public:
	virtual ISplitter* CreateSplitter() = 0;
	virtual IBuild* CreateBuild() = 0;
};

class CBanaryFileFactory : public IFactory
{
public:
	virtual ISplitter* CreateSplitter() { return new CBanaryFile; }
	virtual IBuild* CreateBuild() { return new CBanaryFileB; }
};

class CVedioFileFactory : public IFactory
{
public:
	virtual ISplitter* CreateSplitter() { return new CVedioFile; }
	virtual IBuild* CreateBuild() { return new CBanaryFileB; }
};

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

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

设计二比设计一区别

1.违法设计模式一针对接口而不是实现。111行ISplitterFactory *m_factory;
2.在工厂模式的时候,有三种文件类型,但是只有一种分割功能,现在需要增加合并功能。
3.工厂模式是抽象工厂特例,把抽象工厂的变化虚函数只留下一个,就是工厂模式

模式定义

提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。

模式结构

在这里插入图片描述

要点总结

class IFactory
{
public:
virtual ISplitter* CreateSplitter() = 0;
virtual IBuild* CreateBuild() = 0;
};

缺点:IFactory需要是稳定的,不能随影Create新的产品

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