it-swarm-eu.dev

Jaký je rozdíl mezi all-static-metodami a použitím singletonového vzoru?

Vytvářím databázi pro ukládání informací o uživatelích mých webových stránek (používám stuts2, a proto Java EE technologie). Pro databázi budu vytvářet DBManager. Měl bych použít singleton vzor zde nebo raději, aby všechny metody byly statické?

Budu používat tento DBManager pro základní věci, jako je přidávání, mazání a aktualizace uživatelských profilů. Spolu s tím budu používat pro všechny ostatní účely dotazování, například pro zjištění, zda uživatelské jméno již existuje, a pro získání všech uživatelů pro administrativní účely a podobně.

Moje otázky

  • Jaká je výhoda singletonového vzoru?
  • Která věc je zde nejvhodnější? Všechny statické metody nebo singletonový vzor?
  • Porovnejte je oba.

P.S. Databáze je větší než tato. Tady mluvím pouze o tabulkách, které budu používat pro ukládání informací o uživateli.

28
shahensha

Proč jsou Singleton a statická metoda jedinou možností?

Z mého pohledu jsou obě možnosti docela špatné. Přečtěte si na Singleton AntiPattern . Většina případů použití vzoru Singleton je nesprávná.

Ve vašem případě bych použil objekt instance a použil injekci závislosti (pokud používáte framework DI) nebo Lokátor služeb/Vzor registr

20
Tazzy531

Díky třídě singleton máte větší kontrolu, pokud jde o to, jak spravujete vytvořený objekt.

Za prvé, singleton je objekt. Statická metoda vrací instanci objektu a umožňuje vytvořit pouze jednu instanci nebo více, pokud se tak rozhodnete.

Singletons jsou také líně naložené, což znamená, že nejsou instancovány, až když jsou poprvé povoláni.

Singleton nepoužívá statické metody, takže nebudete mít potíže s jeho použitím v nestatickém kontextu.

Singletons lze rozšířit/podtřídit.

Vzhledem k tomu, že se jedná o objekty, lze je vstřikovat do jiných objektů, které umožňují vytvoření některých skvělých návrhových vzorů využívajících koncepci závislosti závislosti. Takto například funguje model Spring Bean IoC (Invertion Control Dependency Injection).

15
jmort253

Ani to není ideální, ale obzvláště ne banda statiků. Zde je příklad ze skutečného světa z mé zkušenosti. Mluvili jsme s databází. Všichni říkali „bude jen jeden“, takže někdo použil standardní singleton nakonfigurovaný Jarem. Poté byl přidán nový požadavek: kopírovat naše data do jiné (vzdálené) databáze. Jejda. Protože jsme měli skutečný objekt představující DB, a to byla funkce „zřídka používaná“, podařilo se mi ji hacknout vytvořením dočasné kopie a změnou polí a hodnot, ale pokud by to bylo implementováno s globální statikou, bylo by to skutečná katastrofa.

Podle mých zkušeností, když "oni" říkají, že bude pouze jedna DB, jeden uživatel, jedna aplikace, jedno hlavní okno atd., "oni" se mýlí. S Singltonem máte alespoň šanci na refactor a opravit to.

3
user949300

Jaký je rozdíl mezi all-static-metodami a použitím singletonového vzoru?

Oba mají stejný účinek: můžete volat metodu třídy bez ohledu na to, jak získat instanci třídy obsahující metodu.

Pokud však chcete implementovat Unittesting statické metody, jsou problematičtější, protože je nelze snadno zesměšňovat .

Z pohledu testování je snazší přepracovat kód, který používá singeltony, aby se daly sjednotit s falešnými.

Nejflexibilnějším odcizením by bylo mít Dependency_injection bez ohledu na to, jestli používáte framework s kontejnerem di-container (jak navrhuje @ Tazzy531) nebo pokud provádíte závislosti pomocí kódu.

3
k3b

Doufám, že to zde zodpoví pouze hlavní otázku.

V SO je již několik skvělých odpovědí . Budu je citovat.

Nejlepší odpověď, Heinzi :

Singleton se používá k zavedení určitého globálního stavu do aplikace. Pokud je to bez státní příslušnosti, nevidím ani smysl používat singleton, pokud

  • očekáváte, že se v dohledné budoucnosti rozšíří o stát nebo
  • potřebujete instanci objektu z nějakého konkrétního technického důvodu (například, pro příkaz C # SyncLock, i když je to již docela přitažlivé) nebo
  • potřebujete dědičnost, tj. chcete mít možnost snadno nahradit svůj singleton jiným za použití stejného rozhraní, ale jiné implementace. Například metoda Toolkit.getDefaultToolkit() in Java) vrátí singleton, jehož přesný typ závisí na systému.

Vysoce relevantní komentář od back2dos :

(...) singletons jsou zneužívány k představení globálních států. Účelem singletonu není zpřístupnit objekt globálně, ale vynutit si, aby byl objekt vytvořen pouze jednou. Globální objekty jsou nezbytné zlo. Pokud to opravdu není vyžadováno, měli byste se je pokusit nepoužívat, protože obecně vedou k vysoké vazbě s SomeSingleton.getInstance (). SomeMethod () všude.

tzaman také napsal dobrou odpověď:

Viděl jsem případ, kdy se místo třídy statických metod používal singleton bez státní příslušnosti, a to pro Dependency Injection .

Pokud máte pomocnou třídu obslužných funkcí, které přímo používáte, vytvoří skrytou závislost; nemáte žádnou kontrolu nad tím, kdo to může a kde. Vkládání stejné třídy pomocníků pomocí instance bez státní příslušnosti vám umožňuje řídit, kde a jak se používá, a v případě potřeby ji vyměnit/zesměšňovat/atd.

Díky tomu, že se jedná o singletonovou instanci, jednoduše zajistíte, že nepřidělujete žádné další objekty tohoto typu, než je nutné (protože je pouze jeden potřebujete).

A konečně Sebastien také odpověděl docela dobře:

Ve skutečnosti jsem našel jinou odpověď, která zde není uvedena: statické metody je obtížnější testovat.

Zdá se, že většina testovacích rámců funguje skvěle pro metody zesměšňování instance, ale mnoho z nich neřeší slušným způsobem zesměšňování statických metod.

Jak již bylo řečeno, doporučuji používat vzor Toolbox .

2
cregox