設計模式(八)——對象創建模式-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新的產品

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