對象模式所屬類別簡介-對象創建模式
對象創建模式-通過對象創建模式繞開對象創建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新的產品