[ Valerij Zajcev @ 13.06.2010. 16:36 ] @
Dakle radi se za sada o desktop aplikaciji koja ce kasnije verovatno biti web aplikacija, i imam neka dva svoja nacina kako instanciram objekte pa me zanima sta je bolje.
Prvi nacin je ovako nekako, ne znam da li ovo spada u neki creational pattern.
Code:

    public class StorageManager
    {
        private ICandidateDal GetCanidateDal()
        {
            return new CandidateDal();
        }
    }

Drugi nacin je preko singletona, ne znam da li ce ovo imati neku manu kada aplikacija bude radila van desktop-a
Code:

        private ICandidateDal m_CandidateDal = null;
        public ICandidateDal GetCandidateDalInstance()
        {
            if (m_CandidateDal == null)
                m_CandidateDal = new CandidateDal();
            return m_CandidateDal;
        }
[ Dejan Carić @ 13.06.2010. 19:33 ] @
A šta zapravo želiš da uradiš? Zašto mora baš singleton pattern, a ne može ponovno instanciranje objekta?
Ono prvo je factory pattern, ali koliko ima smisla to što je metoda private?
Šta je klasa StorageManager i u kakvoj je vezi sa ostalim klasama?
[ Valerij Zajcev @ 13.06.2010. 19:43 ] @
Imam po jednu, ja je zovem "access" klasa koja mi omogucava da pozivam metode iz svih ostalih klasa u nekom class library-u. StorageManager treba da mi sadrzi pristupne tacke do svih ostalih klasa u DAL-u. Radim refactor starog koda koji u recimo StorageManager ima:
Code:

        private ICandidateDal m_CandidateDal = null;
        public ICandidateDal GetCandidateDalInstance()
        {
            if (m_CandidateDal == null)
                m_CandidateDal = new CandidateDal();
            return m_CandidateDal;
        }

E posto sam nasao na netu da singleton ume u web aplikacijama da napravi problem moram nesto da promenim. Sada sam trenutno u StorageManager stavio:
Code:

public static ICandidateDal GetCanidateDal()
        {
            return new CandidateDal();
        }

        public static ICategoryDal GetCategoryDal()
        {
            return new CategoryDal();
        }
        ...

I kada mi treba objekat koristim:
Code:

...
        return StorageManager.GetCanidateDal().GetCandidateData(personalId);
...

Ono sto me konacno buni u celoj prici, jeste: Da li je ok koristiti ovaj drugi metod koji sam naveo? Da li je ok ovakav rad jer tako kako sam ga napravio svaki put kada trebam nesto da radim sa objektom "Candidate" pravim novi objekat, da li je ovo dobar nacin?
[ Dejan Carić @ 13.06.2010. 20:10 ] @
Za početak, ukloni klasu StorageManager, a instanciraj samo one objekte koji su ti zaista potrebni.

Citat:
Valerij Zajcev:
E posto sam nasao na netu da singleton ume u web aplikacijama da napravi problem moram nesto da promenim

Da li može neki link? Koja je razlika između primene singleton pattern-a u desktop i web aplikacijama?
[ mmix @ 13.06.2010. 20:44 ] @
Singleton pattern na web aplikaciji ne garantuje da je single, samo da postoji jedan po worker procesu. Ako skaliras aplikaciju u farmu ili ako sam asp.net podigne drugi worker proces (ili reciklira stari) singleton i njegov state nisu jedinstveni.
[ Valerij Zajcev @ 13.06.2010. 22:19 ] @
Citat:

Za početak, ukloni klasu StorageManager, a instanciraj samo one objekte koji su ti zaista potrebni.

Zasto? Mislim da je lakse imati jednu pristupnu tacku nego da jurim klase po programu. Sve su metode unutar te klase static i dobijam samo objekat koji trazim ne moram tu samu klasu da instanciram nigde.
[ Dejan Carić @ 13.06.2010. 23:02 ] @
@mmix
Hvala na odgovoru

@Valerij Zajcev

Zato što sa tom klasom ništa ne dobijaš. Što se tiče jurenja po programu.. stavi ih u neki zaseban namespace pa nećeš morati da ih juriš.
Po meni ima smisla koristiti factory pattern u 2 slučaja:

1. Kada prosleđivanjem parametara u konstruktoru nije dovoljno jasno šta će se zapravo instancirati, pa je umesto toga bolje koristiti deskriptivne nazive, tj. factory pattern. Ili kada bi se zakomplikovale sve moguće kombinacije parametara u konstruktoru.
Najprostiji mogući primer:
Imaš klasu Ugao koju instanciraš zadavanjem veličine u stepenima ili radijanima
Code:

class Ugao
{
    public static Ugao UStepenima(decimal stepeni)
    {
         return new Ugao(stepeni);
    }

    public static Ugao URadijanima(decimal radijani)
    {
         // pretvori radijane u stepene
         return new Ugao(stepeni);
    }

    private Ugao(decimal stepeni)
    {
        ....
    }

}

Ovo može biti dosta komplikovanije ukoliko se radi o nekim složenijim klasama.


2. Kada imaš više različitih klasa koje implementiraju isti interfejs.
Primer:
Code:

class VehicleFactory
{
    public enum VehicleType
    {
        Car,
        Bus 
    }

    public static IVehicle CreateVehicle(VehicleType vehicleType)
    {
        switch (vehicleType)
        {
            case VehicleType.Car:
                return new Car();
            case VehicleType.Bus:
                return new Bus();
        }
    }
}

class Car : IVehicle
{
    ....
}

class Bus : IVehicle
{
    ....
}



edit: Izmenio sam prvi primer. Klasa krug je zamenjena klasom ugao.

[Ovu poruku je menjao Dejan Carić dana 14.06.2010. u 17:30 GMT+1]