設計模式(九)——對象創建模式-Prototype

對象模式所屬類別簡介-對象創建模式

對象創建模式-通過對象創建模式繞開對象創建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

設計二更改版本

設計二比設計一區別

模式定義

使用原型實例指定創建對象的種類,然後通過拷貝這些原型來創建新的對象。

模式結構

在這裏插入圖片描述

要點總結

深拷貝的一種應用。

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