Witam, otóż mój wykładowca zażyczył sobie, abyśmy w projekcie użyli jak najwięcej wzorców projektowych. I wcześniej miałem tak:

class Produkt{
public:
	string nazwa;
	int ilosc;

	Produkt(string nazwa, int ilosc);
};


Produkt::Produkt(string nazwa, int ilosc)
{
	this->nazwa = nazwa;
	this->ilosc= ilosc;
};


class Konkretny_produkt{
public:
	float nowa_ilosc;
	string nazwa;
	int ilosc;

	Konkretny_produkt(float nowa_ilosc, Produkt lol);


};



Konkretny_produkt::Konkretny_produkt(float nowa_ilosc, Produkt lol)
{
	this->nazwa = lol.nazwa;
	this->nowa_ilosc = nowa_ilosc;
	this->ilosc= lol.miara;
};

I produkt robię w taki sposób:

Produkt maka("maka", 1000);
Konkretny_produkt konkretnamaka(250, maka);

Czy można to zastąpić jakimś wzorcem projektowym? Albo czy jest jakiś wzorzec, który zrobi mi identyczny obiekt jak "Produkt maka"? I jeżeli tak, to jaki. Ponieważ próbowałem "prototyp", ale w tym wzorcu nowy obiekt tworzy się tak:

IPrototype * pObiekt1 = new CMyPrototype1("maka", 1000);
	IPrototype * pObiekt2 = pObiekt1->Klonuj();

I np nie można zrobić czegoś takiego:

 cout << pObiekt2.nazwa << endl; 

A chciałbym, abym mógł tak robić, bo potrzebuję to w innej części kodu.

@Edit

Chyba, że można jakoś może przerobić ten wzorzec prototyp? Tylko jak? Obecnie to tak wygląda:

// ConsoleApplication12.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <list>
#include <algorithm>
#include <initializer_list>
#include <vector>
#include <iterator>
using namespace std;

int proba = 0;
int g = 0;
int zmiennadokonstruktora = 0;
string tablicadokonstruktora[40];
float zmienna[10];
int zmienna2[10], zmienna5[10];
string zmienna3[10], zmienna4[10];




class IPrototype
{
public:
	virtual IPrototype * Klonuj() const = 0;
	virtual void Wypisz() const = 0;
	virtual ~IPrototype() { }
};

class CMyPrototype1
	: public IPrototype
{
private:
	float cena;
	string nazwa;
	int miara;
	string jednostka;
	string produkt;
	int nowa_miara;
public:
	CMyPrototype1(string nazwa, float cena, int miara, string jednostka, int nowa_miara)
	{
		tablicadokonstruktora[zmiennadokonstruktora] = nazwa;
		zmiennadokonstruktora = zmiennadokonstruktora + 1;
		cout << nazwa << cena << endl;
		this->nazwa = nazwa;
		this->cena = cena;
		this->miara = miara;
		this->jednostka = jednostka;
		this->nowa_miara = nowa_miara;
		cout << nazwa << cena << endl;
	}

	CMyPrototype1(const CMyPrototype1 & kopia)
	{
		this->nazwa = kopia.nazwa;
		this->cena = kopia.cena;
		this->miara = kopia.miara;
		this->jednostka = kopia.jednostka;
		this->nowa_miara = kopia.nowa_miara;
		cout << nazwa << cena << endl;
	}


	virtual IPrototype * Klonuj() const
	{
		//INFO: Przykładowa implementacja klonowania
		return new CMyPrototype1(*this);
	}

	virtual void Wypisz() const
	{
		printf("Liczba = %d\n", cena);
		printf("Komunikat = \"%s\"\n", nazwa);
	}
};


int _tmain(int argc, _TCHAR* argv[])
{

	IPrototype * pObiekt1 = new CMyPrototype1("maka", 1.99, 1000, "gram", 1000);
	IPrototype * pObiekt2 = pObiekt1->Klonuj();
	delete pObiekt1;
	pObiekt2->Wypisz();
	delete pObiekt2;


	return 0;
}