İçeriğe geç

C++ Singleton Design Pattern

Singleton design pattern bir programın çalışma sürecinde bir sınıfın sadece bir defa oluşmasını sağlayıp o sınıftan yararlanmayı sağlamaktadır. Bunu basit bir programda düşünecek olursak müşterilerinizi içeren bir programınız mevcut bilgisayarınızda ve yeni bir müşteri eklediniz müşterilerinizi hem belleğinizde hemde sql server’ınızde tutmak istiyorsunuz. Sql kayıt işleminden sonra bellekte tutmak için sql yeni bir sorgu gönderip geri değeri bellekten tutmak yerine sql başarılı bir şekilde eklediyseniz belleğinizdeki müşterilerinizi yönettiğiniz customermanager classınıza dahil edebilirsiniz. Yapı karmaşık gibi gözükmektedir fakat kullanımı oldukça kolaydır. C++ için kullanımı için örnek kod aşağıdadır.

template <typename T> class Singleton
{
	static T * ms_singleton;

public:
	Singleton()
	{
		//assert(!ms_singleton);
		int offset = (int)(T*)1 - (int)(Singleton <T>*) (T*) 1;
		ms_singleton = (T*)((int)this + offset);
	}

	virtual ~Singleton()
	{
		//assert(ms_singleton);
		ms_singleton = 0;
	}

	__forceinline static T & Instance()
	{
		return (*ms_singleton);
	}

	__forceinline static T * InstancePtr()
	{
		return (ms_singleton);
	}

	__forceinline static T & instance()
	{
		return (*ms_singleton);
	}
};

template <typename T> T * Singleton <T>::ms_singleton = 0;

Burası singleton paterrn’e ait sınıftaki classımız generic bir sınıf. Kendisine verilen tipe göre bellekte yer açıyor ve adreside ms_singleton içerisinde tutuyor.

#include "Singleton.h"
#include <set>

class Customer {
public:
	Customer();
	Customer(int i, const char * n, const char * s);
	~Customer();
	int id;
	std::string name;
	std::string surname;
	void getUserDetail();
};

class CustomerManager : public Singleton<CustomerManager>
{
public:
	CustomerManager();
	inline void addCustomer(Customer* customer)
	{
		customerList.insert(customer);
	}
	void getAllCustomer();
private:
	std::set<Customer*> customerList;
};

Bu ise müşterilerimi ve müşterilerimin listesini tuttuğum classlarımı içeren header file’im. Customer normal bir class fakat CustomerManager Singleton’dan kalıtım alan bir class.

CustomerManager müşterileri tutmak için set yapısı kullanılmıştır.

#include "Customer.h"
#include <stdio.h>

Customer::Customer(){}

Customer::Customer(int i, const char* n, const char* s)
{
	id = i;
	name = n;
	surname = s;
}

Customer::~Customer(){}

void Customer::getUserDetail()
{
	printf("ID: %d, Name: %s Surname:%s\n", id, name.c_str(), surname.c_str());
}

CustomerManager::CustomerManager(){}

void CustomerManager::getAllCustomer() {
	std::set<Customer*>::iterator it;
	for (it = customerList.begin(); it != customerList.end(); it++) {
		(*it)->getUserDetail();
	}
}

Burada ise classlarıma ait kod bloklarım mevcut ve kullanıcıya ait bilgileri yazdırdığım kısa bir method, müşterilerin tüm listesini almak için ise getAllCustomer adında methodum mevcut.

#include <iostream>
#include "Customer.h"

void getCustomer() {
	printf("Method\n");
	CustomerManager::Instance().getAllCustomer();
}

int main()
{
	CustomerManager manager;

	Customer c(1,"asd", "dsa");
	Customer c2(2, "aaa", "bbbb");
	Customer c3(3, "sssss", "aaasd");

	manager.addCustomer(&c);
	manager.addCustomer(&c2);
	manager.addCustomer(&c3);
	
	manager.getAllCustomer();

    std::cout << "Hello World!\n"; 

	getCustomer();
	getchar();
	return 0;
}

Main classım ise gayet basit main içerisinde constructor yardımı ile 3 adet müşteri oluşturdum ve bunları manager içerisinde ekledim(manager 1 defa instance alınarak oluşturulmak zorundadır hiç bir yerde oluşturulmadıysa).

manager.getAllCustomer yardımı ile kullanıcıları listeledim. Burada farklı olarak görünürde hiç bir yerde tutmadığım CustomManager class’ını bir methodda çağırmak istiyorum ama üyelerimle birlikte orada devreye singleton girdi ve onun yardımı ile oluşturulmuş olan instance’dan yardım alarak üyelerimi listeledim.

En son durumda ekran görüntüsü;

singleton ekran görüntüsü



Tarih:C++Design Pattern

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir