Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Wtorek, 17 Lipiec 2018
Zarejestrowanych użytkowników: 4
Dostępnych pytań testowych: 102
HOME
Strona tytułowa pracy dyplomowej
NAUKA
Materiały dydaktyczne związane z OOP
TESTY
Sprawdzenie poziomu zdobytej wiedzy
ZASOBY
Literatura i zasoby sieciowe o OOP
ŹRÓDŁA
Zbiór projektów dydaktycznych z OOP
KONTO
Możliwość śledzenia własnych postępów
INFO


Fabryka abstrakcyjna

Przykład 1
#include "fabryka.h"

#include <iostream>

int main () {
	FabrykaObiektow * fabryka1 = new FabrykaTustina();	
	ObiektDyskretny * fab1Iner1 = fabryka1->utworzInercje1rzedu(1.0, 1.0, 5.0);
	ObiektDyskretny * fab1Iner2 = fabryka1->utworzInercje2rzedu(1.0, 1.0, 2.0, 5.0);

	FabrykaObiektow * fabryka2 = new FabrykaEurerTyl();
	ObiektDyskretny * fab2Iner1 = fabryka2->utworzInercje1rzedu(1.0, 1.0, 5.0);
	ObiektDyskretny * fab2Iner2 = fabryka2->utworzInercje2rzedu(1.0, 1.0, 2.0, 5.0);

	std::clog << "Fabryka Tustina" << std::endl;
	std::clog << fab1Iner1->naString() << std::endl;
	std::clog << fab1Iner2->naString();

	std::clog << std::endl << "Fabryka Eurela roznic w tyl" << std::endl;
	std::clog << fab2Iner1->naString() << std::endl;
	std::clog << fab2Iner2->naString();

	delete fabryka1;
	delete fabryka2;
	delete fab1Iner1;
	delete fab1Iner2;
	delete fab2Iner1;
	delete fab2Iner2;

	return 0;
}
#ifndef __FABRYKA_H__
#define __FABRYKA_H__
#include "obiekt.h"

class FabrykaObiektow {
public:
	virtual Inercja1Rzedu * utworzInercje1rzedu (double Tp, double k, double T1) const = 0;
	virtual Inercja2Rzedu * utworzInercje2rzedu (double Tp, double k, double T1, double T2) const = 0;
protected:
	Inercja1Rzedu * utworzInercje1rzeduAB (const std::string & A, const std::string & B, double Tp, double k, double T1) const;
	Inercja2Rzedu * utworzInercje2rzeduAB (const std::string & A, const std::string & B, double Tp, double k, double T1, double T2) const;
};

class FabrykaEurelPrzod : public FabrykaObiektow {
public:
	virtual Inercja1Rzedu * utworzInercje1rzedu (double Tp, double k, double T1) const;
	virtual Inercja2Rzedu * utworzInercje2rzedu (double Tp, double k, double T1, double T2) const;
};

class FabrykaEurerTyl : public FabrykaObiektow {
public:
	virtual Inercja1Rzedu * utworzInercje1rzedu (double Tp, double k, double T1) const;
	virtual Inercja2Rzedu * utworzInercje2rzedu (double Tp, double k, double T1, double T2) const;
};

class FabrykaTustina : public FabrykaObiektow {
public:
	virtual Inercja1Rzedu * utworzInercje1rzedu (double Tp, double k, double T1) const;
	virtual Inercja2Rzedu * utworzInercje2rzedu (double Tp, double k, double T1, double T2) const;
};

#endif
#include "fabryka.h"

Inercja1Rzedu * FabrykaObiektow::utworzInercje1rzeduAB (const std::string & A, const std::string & B, double Tp, double k, double T1) const {
	return new Inercja1Rzedu (A, B, Tp, k, T1);
}
	
Inercja2Rzedu * FabrykaObiektow::utworzInercje2rzeduAB (const std::string & A, const std::string & B, double Tp, double k, double T1, double T2) const {
	return new Inercja2Rzedu (A, B, Tp, k, T1, T2);
}

Inercja1Rzedu * FabrykaEurelPrzod::utworzInercje1rzedu (double Tp, double k, double T1) const {
	std::string A = "z(T1)+(Ts-T1)";
	std::string B = "kTs";
	return utworzInercje1rzeduAB (A, B, Tp, k, T1);
}
	
Inercja2Rzedu * FabrykaEurelPrzod::utworzInercje2rzedu (double Tp, double k, double T1, double T2) const {
	std::string A = "z^2(T1T2)+z((T1+T2)Ts-2T1T2)+(T1T2-Ts(T1+T2)+(Ts^2))";
	std::string B = "k(Ts^2)";
	return utworzInercje2rzeduAB (A, B, Tp, k, T1, T2);
}

Inercja1Rzedu * FabrykaEurerTyl::utworzInercje1rzedu (double Tp, double k, double T1) const {
	std::string A = "z(T1+Ts)-T1";
	std::string B = "z(kTs)";
	return utworzInercje1rzeduAB (A, B, Tp, k, T1);
}

Inercja2Rzedu * FabrykaEurerTyl::utworzInercje2rzedu (double Tp, double k, double T1, double T2) const {
	std::string A = "z^2(T1T2+Ts(T1+T2)+(Ts^2))+z(-2T1T2-Ts(T1+T2))+(T1T2)";
	std::string B = "z^2(k(Ts^2))";
	return utworzInercje2rzeduAB (A, B, Tp, k, T1, T2);
}

Inercja1Rzedu * FabrykaTustina::utworzInercje1rzedu (double Tp, double k, double T1) const {
	std::string A = "z(Ts+2T1)+(Ts-2T1)";
	std::string B = "z(kTs)+(kTs)";
	return utworzInercje1rzeduAB (A, B, Tp, k, T1);
}

Inercja2Rzedu * FabrykaTustina::utworzInercje2rzedu (double Tp, double k, double T1, double T2) const {
	std::string A = "z^2(4T1T2+2Ts(T1+T2)+(Ts^2))+z(-8T1T2+2(Ts^2))+(4T1T2-2Ts(T1+T2)+(Ts^2))";
	std::string B = "z^2(k(Ts^2))+z(2k(Ts^2))+(k(Ts^2))";
	return utworzInercje2rzeduAB (A, B, Tp, k, T1, T2);
}
#ifndef __OBIEKT_H__
#define __OBIEKT_H__
#include <string>

class ObiektDyskretny {
protected:
	ObiektDyskretny (const std::string & A, const std::string & B, double Tp, double k);
public:
	virtual std::string naString () const = 0;
	virtual double zwrocParametr (const std::string & parametr) const;
protected:
	std::string s_A;
	std::string s_B;
	double s_Tp;
	double s_k;

	friend class FabrykaObiektow;
};

class Inercja1Rzedu : public ObiektDyskretny {
private:
	Inercja1Rzedu (const std::string & A, const std::string & B, double Tp, double k, double T1);
public:
	virtual std::string naString () const;
	virtual double zwrocParametr (const std::string & parametr) const;
private:
	double s_T1;

	friend class FabrykaObiektow;
};

class Inercja2Rzedu : public ObiektDyskretny {
private:
	Inercja2Rzedu (const std::string & A, const std::string & B, double Tp, double k, double T1, double T2);
public:
	virtual std::string naString () const;
	virtual double zwrocParametr (const std::string & parametr) const;
private:
	double s_T1;
	double s_T2;

	friend class FabrykaObiektow;
};

#endif
#include "obiekt.h"
#include <exception>
#include <sstream>

ObiektDyskretny::ObiektDyskretny (const std::string & A, const std::string & B, double Tp, double k) 
	: s_A(A), s_B(B), s_Tp(Tp), s_k(k)
{
}
	
double ObiektDyskretny::zwrocParametr (const std::string & parametr) const {
	if (parametr == "Tp") return s_Tp;
	else if (parametr == "k") return s_k;
	else 
		throw std::exception(std::string("Podany parametr (" + parametr + ") nie jest znany").c_str());
}

Inercja1Rzedu::Inercja1Rzedu (const std::string & A, const std::string & B, double Tp, double k, double T1) 
	: ObiektDyskretny(A, B, Tp, k), s_T1(T1)
{
}

std::string Inercja1Rzedu::naString () const {
	std::stringstream temp;
	temp << "Inercja 1-go rzedu: " << std::endl
		<< " A: " << s_A << std::endl
		<< " B: " << s_B << std::endl
		<< " Tp : " << s_Tp << std::endl
		<< " T1 : " << s_T1 << std::endl;
	return temp.str();
}
	
double Inercja1Rzedu::zwrocParametr (const std::string & parametr) const {
	if (parametr == "T1") 
		return s_T1;
	else 
		return ObiektDyskretny::zwrocParametr(parametr);
}

Inercja2Rzedu::Inercja2Rzedu (const std::string & A, const std::string & B, double Tp, double k, double T1, double T2) 
	: ObiektDyskretny (A, B, Tp, k), s_T1(T1), s_T2(T2)
{
}

std::string Inercja2Rzedu::naString () const {
	std::stringstream temp;
	temp << "Inercja 2-go rzedu: " << std::endl
		<< " A: " << s_A << std::endl
		<< " B: " << s_B << std::endl
		<< " Tp : " << s_Tp << std::endl
		<< " T1 : " << s_T1 << std::endl
		<< " T2 : " << s_T2 << std::endl;
	return temp.str();
}
	
double Inercja2Rzedu::zwrocParametr (const std::string & parametr) const {
	if (parametr == "T1") return s_T1;
	else if (parametr == "T2") return s_T2;
	else
		return ObiektDyskretny::zwrocParametr(parametr);
}
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11