對象模式所屬類別簡介-對象創建模式
對象創建模式-通過對象創建模式繞開對象創建new,避免new導致的緊耦合。典型模式有factory method,abstract method,prototype,builder
當前模式簡介
prototype-原型模式(工廠類是生產和業務分開,原型是生產和業務合併。)
對象結構複雜,如果創建對象很簡單,使用工廠方法,如果很複雜,就使用原型方法。
需求
設計一個文件分割器。當前文件類型只有二進制文件。點擊按鈕即可分割。
設計一
無
需求更改
無
設計一更改版本
無
違反原則
無
設計二
#include "stdafx.h"
#include <iostream>
using namespace std;
class ISplitter
{
public:
virtual ~ISplitter(){}
virtual void splitter() = 0;
virtual ISplitter* clone() = 0;
};
class CBanaryFile : public ISplitter
{
public:
virtual void splitter() { std::cout << "CBanaryFile" << std::endl; }
virtual ISplitter* clone() { return new CBanaryFile(*this); }
};
class CVedioFile : public ISplitter
{
public:
virtual void splitter() { std::cout << "CVedioFile" << std::endl; }
virtual ISplitter* clone() { return new CVedioFile(*this); }
};
class CPictureFile : public ISplitter
{
public:
virtual void splitter() { std::cout << "CPictureFile" << std::endl; }
virtual ISplitter* clone() { return new CPictureFile(*this); }
};
///////////////////////////////////////////
class CMainForm
{
public:
ISplitter *m_factory;//寫到屬性而不直接new是因爲每次點擊buttom可以指向不同的對象。如果寫到bottom還要傳遞進來,一般觸發bottom沒有傳遞東西
CMainForm(ISplitter *factory){ this->m_factory = factory; }
void BottomClick()
{
ISplitter *splinter = m_factory->clone(); //多態new
splinter->splitter();
}
};
int main() //調用
{
CMainForm main(new CVedioFile);
main.BottomClick();
return 0;
}
//打印
CVedioFile
設計二更改版本
無
設計二比設計一區別
無
模式定義
使用原型實例指定創建對象的種類,然後通過拷貝這些原型來創建新的對象。
模式結構
要點總結
深拷貝的一種應用。