ස්ථිතික පංතියක් සහ සිංගල්ටන් රටාවක් අතර පවතින සැබෑ (එනම් ප්රායෝගික) වෙනස කුමක්ද?
ක්ෂණිකව තොරව දෙකම ආයාචනා කළ හැකිය, දෙකම සපයන්නේ එක් "අවස්ථාවක්" පමණක් වන අතර ඒ දෙකම නූල් ආරක්ෂිත නොවේ. වෙනත් වෙනසක් තිබේද?
singleton
වස්තුවකි static
.
ස්ථිතික පංතියක් සහ සිංගල්ටන් රටාවක් අතර පවතින සැබෑ (එනම් ප්රායෝගික) වෙනස කුමක්ද?
ක්ෂණිකව තොරව දෙකම ආයාචනා කළ හැකිය, දෙකම සපයන්නේ එක් "අවස්ථාවක්" පමණක් වන අතර ඒ දෙකම නූල් ආරක්ෂිත නොවේ. වෙනත් වෙනසක් තිබේද?
singleton
වස්තුවකි static
.
Answers:
සිංගල්ටන් හෝ ස්ථිතික ක්රමයක් නූල් ආරක්ෂිත නොවන බව ඔබට පැවසීමට හේතුව කුමක්ද? සාමාන්යයෙන් දෙකම යුතු නූල්-ආරක්ෂිත ක්රියාත්මක කළ යුතුය.
සිංගල්ටන් සහ ස්ථිතික ක්රම සමූහයක් අතර ඇති විශාල වෙනස නම්, සිංගල්ටෝනවලට අතුරුමුහුණත් ක්රියාත්මක කළ හැකි වීමයි (හෝ ප්රයෝජනවත් පාදක පන්ති වලින් ව්යුත්පන්න වී ඇත, එය එතරම් සුලභ නොවූවත්, මගේ අත්දැකීම් අනුව), එබැවින් ඔබට සිංගල්ටන් වටා ගමන් කළ හැකිය “එය තවත් එකක් ක්රියාත්මක කිරීම.
Foo
, ඔබට Foo
පරාමිතියක් ලෙස ක්රමයක් ගත හැකිය . එම සැකසුම සමඟ, ඇමතුම්කරුවන්ට ක්රියාත්මක කිරීම ලෙස සිංගල්ටන් භාවිතා කිරීමට තෝරා ගත හැකිය - නැතහොත් ඔවුන්ට වෙනත් ක්රියාත්මක කිරීමක් භාවිතා කළ හැකිය. මෙම ක්රමය සිංගල්ටන් වලින් විසන්ධි වේ. පංතියට ස්ථිතික ක්රම ඇති තත්වය සමඟ සසඳන්න - එම ක්රම ඇමතීමට අවශ්ය සෑම කේත කැබැල්ලක්ම පන්තියට තදින් සම්බන්ධ කර ඇත, මන්ද ස්ථිතික ක්රම අඩංගු වන්නේ කුමන පන්තියටද යන්න නියම කළ යුතුය.
සත්ය පිළිතුර මෙහි තවත් සංසදයක ජෝන් ස්කීට් විසිනි.
තනි තනි තනි අවස්ථාවකට ප්රවේශ වීමට සිංගල්ටන් ඉඩ දෙයි - එම අවස්ථාව (හෝ ඒ සඳහා යොමු කිරීමක්) වෙනත් ක්රමවලට පරාමිතියක් ලෙස සම්මත කළ හැකි අතර සාමාන්ය වස්තුවක් ලෙස සලකනු ලැබේ.
ස්ථිතික පන්තියකට ඉඩ දෙන්නේ ස්ථිතික ක්රම පමණි.
interface
සිංගල්ටන් පංතියක් සමඟ ක්රියාත්මක කළ හැකිය , නමුත් පන්තියේ ස්ථිතික ක්රම (හෝ උදා: සී # static class
) කළ නොහැක.ස්ථිතික පංතිවලට වඩා සිංගල්ටන් රටාවට වාසි කිහිපයක් තිබේ. පළමුවෙන්ම, තනි පුද්ගලයෙකුට පන්ති දීර් extend කර අතුරු මුහුණත් ක්රියාත්මක කළ හැකි අතර ස්ථිතික පන්තියකට එය කළ නොහැක (එයට පන්ති දීර් extend කළ හැකි නමුත් එය ඔවුන්ගේ උදාහරණ සාමාජිකයින්ට උරුම නොවේ). සිංගල්ටන් එකක් කම්මැලි හෝ අසමමුහුර්තව ආරම්භ කළ හැකි අතර ස්ථිතික පංතියක් සාමාන්යයෙන් පළමු වරට පටවන විට එය ආරම්භ කළ හැකි අතර එය පන්ති පැටවුම් ගැටළු වලට තුඩු දෙයි. කෙසේ වෙතත් වඩාත්ම වැදගත් වාසිය නම්, එක් අවස්ථාවක් පමණක් ඇතැයි උපකල්පනය කිරීමට ඔවුන්ගේ පරිශීලකයින්ට බල නොකර තනි තනිව බහුඅවයවික ලෙස හැසිරවිය හැකි වීමයි.
static
පංති යනු රාජ්යයට අවශ්ය කිසිවක් සඳහා නොවේ. කාර්යයන් සමූහයක් එකට තැබීම සඳහා එය ප්රයෝජනවත් වේ Math
( එනම් Utils
ව්යාපෘති වල). එබැවින් පංතියේ නම අපට කාර්යයන් සොයා ගත හැකි හෝඩුවාවක් ලබා දෙයි.
Singleton
මගේ ප්රියතම රටාව වන අතර මම එය එක් අවස්ථාවකදී යමක් කළමනාකරණය කිරීමට භාවිතා කරමි. එය static
පන්තිවලට වඩා නම්යශීලී වන අතර එහි තත්වය පවත්වා ගත හැකිය. එයට අතුරු මුහුණත් ක්රියාත්මක කිරීමට, වෙනත් පංතිවලින් උරුම වීමට සහ උරුමයට ඉඩ දිය හැකිය.
අතර තෝරා මගේ පාලනය static
හා singleton
:
එකට තබා ගත යුතු කාර්යයන් සමූහයක් තිබේ static
නම්, තේරීම වේ. සමහර සම්පත් සඳහා තනි ප්රවේශයක් අවශ්ය වෙනත් දෙයක් a ලෙස ක්රියාත්මක කළ හැකිය singleton
.
State
සමඟ වෙනස් වන වස්තුවක විවිධ ගුණාංගවල එකතුවකි. විධිමත් අර්ථ දැක්වීම සඳහා ඔබට ගූගල් කළ හැකිය.
ස්ථිතික පන්තිය: -
ඔබට ස්ථිතික පන්තියේ උදාහරණය නිර්මාණය කළ නොහැක.
පංතිය අඩංගු වැඩසටහන හෝ නාම අවකාශය පටවන විට .NET Framework පොදු භාෂා ධාවන කාලය (CLR) මඟින් ස්වයංක්රීයව පූරණය වේ.
ස්ථිතික පන්තියට ඉදිකිරීම්කරුවෙකු සිටිය නොහැක.
අපට ස්ථිතික පන්තිය ක්රමයට සමත් කළ නොහැක.
අපට C # හි වෙනත් ස්ථිතික පන්තියකට ස්ථිතික පන්තිය උරුම කර ගත නොහැක.
සියලු ස්ථිතික ක්රම ඇති පන්තියක්.
වඩා හොඳ කාර්ය සාධනය (ස්ථිතික ක්රම සම්පාදනය කරන වේලාව මත බන්ධනය වේ)
සිංගල්ටන්: -
ඔබට වස්තුවේ එක් අවස්ථාවක් නිර්මාණය කර එය නැවත භාවිතා කළ හැකිය.
පරිශීලකයා ඉල්ලූ විට පළමු වරට සිංගල්ටන් උදාහරණය නිර්මාණය වේ.
සිංගල්ටන් පන්තියට ඉදිකිරීම්කරුවෙකු සිටිය හැකිය.
ඔබට සිංගල්ටන් පංතියේ වස්තුව නිර්මාණය කර එය ක්රමයට යොමු කළ හැකිය.
සිංගල්ටන් පංතිය උරුමය පිළිබඳ කිසිදු සීමාවක් නොකියයි.
අපට තනි පන්තියක වස්තු බැහැර කළ හැකි නමුත් ස්ථිතික පන්තියට අයත් නොවේ.
ක්රම ඉක්මවා යා හැකිය.
අවශ්ය විට කම්මැලි පැටවිය හැකිය (ස්ථිතික පන්ති සෑම විටම පටවනු ලැබේ).
අපට අතුරු මුහුණත ක්රියාත්මක කළ හැකිය (ස්ථිතික පන්තියට අතුරු මුහුණත ක්රියාත්මක කළ නොහැක).
ස්ථිතික පංතිය යනු ස්ථිතික ක්රම පමණක් ඇති අතර ඒ සඳහා වඩා හොඳ වචනයක් “ශ්රිත” වේ. ස්ථිතික පංතියක අන්තර්ගත මෝස්තර විලාසය තනිකරම ක්රියා පටිපාටියකි.
සිංගල්ටන් යනු OO නිර්මාණයට විශේෂිත රටාවකි. එය වස්තුවක නිදසුනකි (බහුමාපකය වැනි එයට ඇති සියලු හැකියාවන් සහිත), නිර්මාණ ක්රියාවලියක් සමඟින්, එම සුවිශේෂී භූමිකාවේ මුළු ජීවිත කාලය පුරාම එකම අවස්ථාවක් පමණක් ඇති බව සහතික කරයි.
සිංගල්ටන් රටාවෙන් ඔබට ව්යුත්පන්න වර්ගයක නිදසුනක් ලෙස සිංගල්ටන් නිර්මාණය කළ හැකිය, ස්ථිතික පන්තියකින් ඔබට එය කළ නොහැක.
ඉක්මන් උදාහරණය:
if( useD3D )
IRenderer::instance = new D3DRenderer
else
IRenderer::instance = new OpenGLRenderer
ජෝන් ස්කීට්ගේ පිළිතුර පුළුල් කිරීමට
සිංගල්ටන් සහ ස්ථිතික ක්රම සමූහයක් අතර ඇති විශාල වෙනස නම්, සිංගල්ටෝනවලට අතුරුමුහුණත් ක්රියාත්මක කළ හැකි වීමයි (හෝ ප්රයෝජනවත් මූලික පංති වලින් ව්යුත්පන්න වූවත්, එය අඩු පොදු IME වුවද), එබැවින් ඔබට සිංගල්ටන් වටා ගමන් කළ හැක්කේ එය “තවත්” ක්රියාත්මක කිරීමක් ලෙස ය.
ඒකකයක් පන්තියක් පරීක්ෂා කිරීමේදී වැඩ කිරීමට පහසුය. ඔබ සිංගල්ටන් පරාමිතියක් ලෙස කොතැනට ගියත් (ඉදිකිරීම්කරුවන්, සැකසුම් කරන්නන් හෝ ක්රම) ඔබට ඒ වෙනුවට සිංගල්ටන්හි සමච්චල් කරන ලද හෝ මුරණ්ඩු අනුවාදයක් ආදේශ කළ හැකිය.
MySingleton mockOfMySingleton = mock(MySingleton.class)
.
new ClazzToTest(mockSingleton);
මෙන්න හොඳ ලිපියක්: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html
ක්රම ඉක්මවා යා නොහැක, නමුත් ක්රම සැඟවීම භාවිතා කළ හැකිය. ( ජාවා හි සැඟවී ඇති ක්රමය කුමක්ද? ජාවාඩොක් පැහැදිලි කිරීම පවා ව්යාකූලයි )
public class Animal {
public static void foo() {
System.out.println("Animal");
}
}
public class Cat extends Animal {
public static void foo() { // hides Animal.foo()
System.out.println("Cat");
}
}
සාරාංශයක් ලෙස, මම භාවිතා කරන්නේ ක්රම භාවිතා කිරීම සඳහා ස්ථිතික පන්ති පමණක් වන අතර අනෙක් සියල්ල සඳහා සිංගල්ටන් භාවිතා කරමි.
සංස්කරණය කරයි
ස්ථිතික පංති කම්මැලි පටවා ඇත. ස්තූතියි @jmoreno ( ස්ථිතික පන්ති ආරම්භය සිදු වන්නේ කවදාද? )
ස්ථිතික පන්ති සඳහා සැඟවීමේ ක්රමය. ස්තූතියි ax මැක්ස්පෙන්ග්.
Animal animal = new Cat();
නම් animal.foo();
කුමක් සිදුවේද?
මම ශ්රේෂ් O OO න්යායවාදියෙක් නොවෙමි, නමුත් මා දන්නා දෙයින්, සිංගල්ටන් හා සසඳන විට ස්ථිතික පංති නොමැති එකම OO ලක්ෂණය වන්නේ බහුමාපකයයි. නමුත් ඔබට එය අවශ්ය නොවන්නේ නම්, ස්ථිතික පංතියක් සමඟ ඔබට ඇත්ත වශයෙන්ම උරුමය (අතුරු මුහුණත ක්රියාත්මක කිරීම ගැන විශ්වාස නැත) සහ දත්ත සහ ශ්රිත සංයුක්තකරණය තිබිය හැකිය.
මොරෙන්ඩිල්ගේ ප්රකාශය, “ස්ථිතික පංතියක අන්තර්ගත මෝස්තරය තනිකරම ක්රියා පටිපාටියකි” මම වැරදියි, නමුත් මම එකඟ නොවෙමි. ස්ථිතික ක්රම වලදී ඔබට ස්ථිතික සාමාජිකයින්ට ප්රවේශ විය හැකිය, එය ඔවුන්ගේ තනි අවස්ථාවන්හි සාමාජිකයින්ට ප්රවේශ වන සිංගල්ටන් ක්රමයට සමාන වේ.
සංස්කරණය කරන්න:
මම දැන් සිතන්නේ තවත් වෙනසක් වන්නේ ස්ථිතික පංතියක් වැඩසටහන් ආරම්භයේදීම ක්ෂණිකව ක්රියාත්මක වන අතර වැඩසටහනේ මුළු ජීවිත කාලය පුරාම ජීවත් වන අතර සිංගල්ටන් එකක් යම් අවස්ථාවක දී පැහැදිලිවම ක්ෂණිකව ක්ෂණිකව ස්ථාපනය කර විනාශ කළ හැකි බවයි.
* හෝ භාෂාව අනුව එය මුලින් භාවිතා කළ හැකි යැයි මම සිතමි.
ජොන්ගේ කාරණය SomeClass
නිදර්ශනය ILogger
කිරීම සඳහා ලොජර් ස්ථිතික පංතියක් නම් පහත දැක්වෙන දේ කළ නොහැක . ක්රියාත්මක කිරීමේ අවස්ථාවක් එහි ඉදිකිරීම්කරු වෙත ලබා දීම පන්තිය අපේක්ෂා කරයි .
පරායත්ත එන්නත් කිරීම සඳහා සිංගල්ටන් පන්තිය වැදගත් වේ.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var someClass = new SomeClass(Logger.GetLogger());
}
}
public class SomeClass
{
public SomeClass(ILogger MyLogger)
{
}
}
public class Logger : ILogger
{
private static Logger _logger;
private Logger() { }
public static Logger GetLogger()
{
if (_logger==null)
{
_logger = new Logger();
}
return _logger;
}
public void Log()
{
}
}
public interface ILogger
{
void Log();
}
}
සිංගල්ටන් යනු සාමාන්ය පන්තියක් වන අතර එය ක්ෂණිකව ක්රියාත්මක වන නමුත් එක් වරක් හා වක්රව සේවාදායක කේතයෙන් ලබා ගත හැකිය. ස්ථිතික පන්තිය ක්ෂණික නොවේ. මා දන්නා පරිදි ස්ථිතික ක්රම (ස්ථිතික පන්තියට ස්ථිතික ක්රම තිබිය යුතුය) ස්ථිතික නොවන ඒවාට වඩා වේගවත් වේ.
සංස්කරණය කරන්න:
FxCop කාර්ය සාධන රීති විස්තරය: "නිදර්ශන දත්ත හෝ ඇමතුම් නිදර්ශන ක්රම වලට ප්රවේශ නොවන ක්රම ස්ථිතික ලෙස සලකුණු කළ හැකිය (VB හි බෙදාගෙන ඇත). එසේ කිරීමෙන් පසු, සම්පාදකයා විසින් මෙම සාමාජිකයින්ට අථත්ය නොවන ඇමතුම් අඩවි විමෝචනය කරනු ඇත. වත්මන් වස්තු දර්ශකය ශුන්ය නොවන බව රක්ෂණය කරන සෑම ඇමතුමකටම ධාවන වේලාවේදී පරීක්ෂා කරන්න.මේ ප්රති performance ලයක් ලෙස කාර්ය සාධනය-සංවේදී කේත සඳහා මැනිය හැකි කාර්යසාධනයක් ලබා ගත හැකිය. සමහර අවස්ථාවලදී, වත්මන් වස්තු සිද්ධියට ප්රවේශ වීමට අපොහොසත් වීම නිරවද්යතා ගැටලුවක් නියෝජනය කරයි.
ස්ථිතික පංතිවල ස්ථිතික ක්රම සඳහාද මෙය අදාළ වේදැයි මම නොදනිමි.
සිංගල්ටන් ක්ෂණිකව ස්ථාපනය කර ඇත, එය ක්ෂණිකව ස්ථාපනය කර ඇත්තේ එක් අවස්ථාවක් පමණි, එබැවින් සිංගල්ටන් හි තනි එකකි .
ස්ථිතික පංතියක් තමා හැර වෙනත් කිසිවක් මගින් ක්ෂණිකව දැක්විය නොහැක.
ප්රධාන වෙනස්කම්:
පරීක්ෂණ දෘෂ්ටිකෝණයෙන් සිංගල්ටන් වඩා හොඳ ප්රවේශයකි. ස්ථිතික පංති මෙන් නොව, සිංගල්ටන්ට අතුරුමුහුණත් ක්රියාත්මක කළ හැකි අතර ඔබට ව්යාජ උදාහරණ භාවිතා කර එන්නත් කළ හැකිය.
පහත උදාහරණයෙන් මම මෙය පැහැදිලි කරමි. ඔබට ගුඩ්ප්රයිස් () ක්රමයක් ඇති අතර එය getPrice () ක්රමයක් භාවිතා කරයි යැයි සිතමු. ඔබ getPrice () ක්රමයක් තනි ක්රමයක් තුළ ක්රියාත්මක කරයි.
getPrice ක්රියාකාරීත්වය සපයන සිංගල්ටන්:
public class SupportedVersionSingelton {
private static ICalculator instance = null;
private SupportedVersionSingelton(){
}
public static ICalculator getInstance(){
if(instance == null){
instance = new SupportedVersionSingelton();
}
return instance;
}
@Override
public int getPrice() {
// calculate price logic here
return 0;
}
}
GetPrice භාවිතය:
public class Advisor {
public boolean isGoodDeal(){
boolean isGoodDeal = false;
ICalculator supportedVersion = SupportedVersionSingelton.getInstance();
int price = supportedVersion.getPrice();
// logic to determine if price is a good deal.
if(price < 5){
isGoodDeal = true;
}
return isGoodDeal;
}
}
In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by:
Make your singleton implement an interface and inject it.
public interface ICalculator {
int getPrice();
}
අවසාන සිංගල්ටන් ක්රියාත්මක කිරීම:
public class SupportedVersionSingelton implements ICalculator {
private static ICalculator instance = null;
private SupportedVersionSingelton(){
}
public static ICalculator getInstance(){
if(instance == null){
instance = new SupportedVersionSingelton();
}
return instance;
}
@Override
public int getPrice() {
return 0;
}
// for testing purpose
public static void setInstance(ICalculator mockObject){
if(instance != null ){
instance = mockObject;
}
පරීක්ෂණ පන්තිය:
public class TestCalculation {
class SupportedVersionDouble implements ICalculator{
@Override
public int getPrice() {
return 1;
}
}
@Before
public void setUp() throws Exception {
ICalculator supportedVersionDouble = new SupportedVersionDouble();
SupportedVersionSingelton.setInstance(supportedVersionDouble);
}
@Test
public void test() {
Advisor advidor = new Advisor();
boolean isGoodDeal = advidor.isGoodDeal();
Assert.assertEquals(isGoodDeal, true);
}
}
GetPrice () ක්රියාත්මක කිරීම සඳහා ස්ථිතික ක්රමයක් භාවිතා කිරීමේ විකල්පය අප විසින් ගනු ලැබුවහොත්, getPrice () සමච්චලයට ලක් කිරීම දුෂ්කර විය. ඔබට බල විහිළුවක් සමඟ ස්ථිතික ලෙස සමච්චල් කළ හැකිය, නමුත් සෑම නිෂ්පාදනයක්ම එය භාවිතා කළ නොහැක.
මෙම නිර්වචනය සමඟ මම එකඟ වෙමි:
වචනය " තනි " තේරුම යෙදුම් ජීවන චක්රය හරහා තනි වස්තුවකි, එබැවින් විෂය පථය යෙදුම් මට්ටමින් පවතී.
මෙම ස්ථිතික ඕනෑම වස්තු පහිටුම් දක්වනය නැහැ, ඒ නිසා විෂය පථය යෙදුම වසම් මට්ටමින් වේ.
නූල් ආරක්ෂිත වීමට මේ දෙකම ක්රියාත්මක කළ යුතුය.
ඔබට සිත්ගන්නාසුලු වෙනත් වෙනස්කම් සොයාගත හැකිය: සිංගල්ටන් රටාව එදිරිව ස්ථිතික පන්තිය
සැලකිය යුතු වෙනසක් වන්නේ සිංගල්ටන් සමඟ එන වෙනස් වූ ක්ෂණිකකරණයයි.
ස්ථිතික පංති සමඟ, එය සීඑල්ආර් විසින් නිර්මාණය කරනු ලබන අතර අපට එය පාලනය කළ නොහැක. සිංගල්ටන් සමඟ, වස්තුව ප්රවේශ වීමට උත්සාහ කළ පළමු අවස්ථාවේදීම එය ක්ෂණිකව ලබා ගනී.
බොහෝ අවස්ථාවන්හීදී, මේ දෙකෙහි ප්රායෝගික වෙනසක් නොමැත, විශේෂයෙන් සිංගල්ටන් උදාහරණය කිසි විටෙකත් වෙනස් නොවේ නම් හෝ ඉතා සෙමින් වෙනස් නොවේ නම් උදා.
විශේෂිත ස්ථිතික පමණක් ජාවා පන්තියට වඩා තනි වෙනසක් තවමත් සාමාන්ය ජාවා බෝංචි බව මම කියමි. මේ හේතුව නිසා, තවත් බොහෝ අවස්ථාවන්හිදී තනි පුද්ගලයෙකු පිළිගනු ලැබේ; එය ඇත්ත වශයෙන්ම පෙරනිමි වසන්ත රාමුවේ ක්ෂණික උපාය මාර්ගයයි. එය තනි තනිව ගමන් කරන බව පාරිභෝගිකයා දැන හෝ නොදැන සිටිය හැකිය, එය සාමාන්ය ජාවා බෝංචි ලෙස සලකයි. අප බොහෝ විට වසන්තයේ දකින පරිදි, අවශ්යතා වෙනස් වී සිංගල්ටන් එකක් මූලාකෘතියක් බවට පත්වීමට අවශ්ය නම්, එය පාරිභෝගිකයාට කේත වෙනසක් නොමැතිව සම්පූර්ණයෙන්ම බාධාවකින් තොරව කළ හැකිය.
ස්ථිතික පංතියක් තනිකරම ක්රියා පටිපාටිය විය යුතු බව වෙනත් අයෙකු කලින් සඳහන් කර ඇත. උදා: java.lang.Math. මගේ මතකයේ හැටියට, එවැනි පංතියක් කිසි විටෙකත් සම්මත නොවිය යුතු අතර ඔවුන් කිසි විටෙකත් ස්ථිතික අවසාන හැර වෙනත් කිසිවක් ගුණාංග ලෙස තබා නොගත යුතුය. අනෙක් සියල්ල සඳහා, සිංගල්ටන් එකක් භාවිතා කරන්න, එය වඩා නම්යශීලී සහ නඩත්තු කිරීමට පහසු බැවින්.
පසුපසට සම්බන්ධ වන අපගේ ඩීබී රාමුව අප සතුව ඇත. බහු පරිශීලකයින් හරහා අපිරිසිදු කියවීම් වළක්වා ගැනීමට අපි ඕනෑම වේලාවක තනි අවස්ථාවක් ලබා ගත හැකි බව සහතික කිරීම සඳහා අපි සිංගල්ටන් රටාව භාවිතා කර ඇත්තෙමු.
C # හි ස්ථිතික පන්තියකට අතුරු මුහුණතක් ක්රියාත්මක කළ නොහැක. ව්යාපාර ගිවිසුම් හෝ අයිඕසී අරමුණු සඳහා තනි උදාහරණ පන්තියකට අතුරු මුහුණතක් ක්රියාත්මක කිරීමට අවශ්ය වූ විට, ස්ථිතික පන්තියකින් තොරව මම සිංගල්ටන් රටාව භාවිතා කරමි.
අස්ථායි තත්වයන් තුළ තත්වය පවත්වා ගැනීමට සිංගල්ටන් ක්රමයක් සපයයි
ඔබට උපකාරී වන බලාපොරොත්තුව ..
ජේඩීකේට සිංගල්ටන් සහ ස්ථිතික යන දෙකටම උදාහරණ ඇත, එක් අතකින් java.lang.Math
ස්ථිතික ක්රම සහිත අවසාන පන්තියකි, අනෙක් පැත්තෙන් java.lang.Runtime
සිංගල්ටන් පන්තියකි.
සිංගල්ටන් වල වාසි
සිංගල්ටන් රටාවට වඩා රාජ්යය පවත්වා ගැනීමේ අවශ්යතාවය ස්ථිතික පන්තියට වඩා හොඳ තේරීමක් නම්, ස්ථිතික පංතියේ තත්වය පවත්වා ගැනීම දෝෂ වලට, විශේෂයෙන් සමගාමී පරිසරය තුළ, බහු නූල් මගින් ප්රමාණවත් සමමුහුර්තකරණය සමාන්තර වෙනස් කිරීමකින් තොරව ධාවන තත්වයන්ට මඟ පෑදිය හැකි බැවිනි.
සිංගල්ටන් පංතියේ බර වස්තුවක් නම් කම්මැලි පැටවිය හැකි නමුත් ස්ථිතික පන්තියට එවැනි වාසි නොමැති අතර සෑම විටම උනන්දුවෙන් පටවනු ලැබේ.
සිංගල්ටන් සමඟ, ඔබට මූලික පන්තියක් දීර් extend කිරීමට, අතුරු මුහුණතක් ක්රියාත්මක කිරීමට සහ විවිධ ක්රියාත්මක කිරීම් සැපයීමට උරුමය සහ බහුමාපකය භාවිතා කළ හැකිය.
ජාවා හි ස්ථිතික ක්රම ඉක්මවා යා නොහැකි බැවින් ඒවා නම්යශීලීභාවයට හේතු වේ. අනෙක් අතට, සිංගල්ටන් පංතියේ අර්ථ දක්වා ඇති ක්රම දීර් ing කිරීමෙන් ඔබට එය අභිබවා යා හැකිය.
ස්ථිතික පන්තියේ අවාසි
ස්ථිතික පන්තියේ වාසි
සවිස්තරාත්මක විස්තරය ඒ සෑම එකක්ම වාචික බැවින් මම හොඳ ලිපියකට සබැඳියක් තැබුවෙමි - ඔබට සිංගල්ටන් ගැන දැන ගැනීමට අවශ්ය සියල්ල
ඒ. අනුක්රමිකකරණය - ස්ථිතික සාමාජිකයන් පන්තියට අයත් වන අතර එබැවින් අනුක්රමිකකරණය කළ නොහැක.
බී. අප විසින් ඉදිකිරීම්කරු පුද්ගලික කර ඇති නමුත් ස්ථිතික සාමාජික විචල්යයන් තවමත් උප පංතියට ගෙන යනු ඇත.
ඇ. අපට කම්මැලි ආරම්භයක් කළ නොහැකි බැවින් සියල්ල පැටවෙන්නේ පන්ති පැටවීමේදී පමණි.
සේවාදායකයාගේ දෘෂ්ටි කෝණයෙන්, ස්ථිතික හැසිරීම සේවාදායකයාට දන්නා නමුත් සිංගල්ටන් හැසිරීම සේවාදායකයකුගෙන් සැඟවිය හැක. ඔහු නැවත නැවතත් සෙල්ලම් කරන එකම එක් අවස්ථාවක් පමණක් සේවාදායකයා නොදැන සිටිය හැකිය.
මම පහත සඳහන් දේ කියවා එය අර්ථවත් යැයි සිතමි:
ව්යාපාර රැකබලා ගැනීම
මතක තබා ගන්න, වඩාත්ම වැදගත් OO රීති වලින් එකක් වන්නේ වස්තුවක් තමාටම වගකිව යුතු බවයි. මෙයින් අදහස් කරන්නේ පන්තියක ජීවන චක්රය පිළිබඳ ගැටළු පන්තිය තුළ හැසිරවිය යුතු අතර ස්ථිතික වැනි භාෂා ව්යුහයන්ට පවරා නොමැති බවයි.
Objected-Oriented Think Process 4 වන සංස්කරණය.
මම ලියූ ලිපියක, ස්ථිතික පන්තියකට වඩා සිංගල්ටන් වඩා හොඳ වන්නේ මන්ද යන්න පිළිබඳ මගේ දෘෂ්ටිකෝණය විස්තර කර ඇත:
අපට සිංගල්ටන් පංතියේ වස්තුව නිර්මාණය කර එය ක්රමයට යොමු කළ හැකිය.
සිංගල්ටන් පන්තිය උරුමය සීමා නොකරයි.
අපට ස්ථිතික පංතියක වස්තු බැහැර කළ නොහැකි නමුත් තනි පන්තියකට හැකිය.
තනි ස්ථිතික පංති අවස්ථාවක් (එනම්, ස්ථිතික හෝ ගෝලීය විචල්යයක් වන පන්තියක තනි අවස්ථාවක්) සහ තනි ස්ථිතික දර්ශකයක් අතර විශාල වෙනසක් ඇත. මත පන්තියේ නිදසුනක් :
ඔබගේ යෙදුම පිටවන විට, ස්ථිතික පන්තියේ නිදසුන විනාශ කරන්නා ලෙස හැඳින්වේ. ඒ කියන්නේ ඔබ එම ස්ථිතික අවස්ථාව සිංගල්ටන් ලෙස භාවිතා කළේ නම්, ඔබේ සිංගල්ටන් නිසි ලෙස ක්රියා කිරීම නවතා දැමීය. එම සිංගල්ටන් භාවිතා කරන කේත ධාවනය තවමත් තිබේ නම්, උදාහරණයක් ලෙස වෙනත් ත්රෙඩ් එකක, එම කේතය බිඳ වැටීමට ඉඩ ඇත.
මගේ හිසෙහි වෙනස වන්නේ වස්තු දිශානත වැඩසටහන්කරණය (සිංගල්ටන් / මූලාකෘති) හෝ ක්රියාකාරී වැඩසටහන්කරණය (ස්ථිතික) ක්රියාත්මක කිරීමයි.
අපි අවධානය යොමු කළ යුත්තේ සිංගල්ටන් රටාව මගින් නිර්මාණය කරන ලද වස්තූන් ගණන කෙරෙහි ය. අප අවධානය යොමු කළ යුත්තේ අවසානයේ දී අප වස්තුවක් රඳවා තබා ගැනීමයි. අනෙක් අය දැනටමත් පවසා ඇති පරිදි, එය දීර්, කළ හැකිය, පරාමිතියක් ලෙස සම්මත කළ හැකි නමුත් වඩාත්ම වැදගත් දෙය එය රාජ්යයෙන් පිරී තිබීමයි.
අනෙක් අතට ක්රියාකාරී වැඩසටහන් ක්රියාත්මක කිරීම සඳහා ස්ථිතික භාවිතා වේ. ස්ථිතික සාමාජිකයන් පන්තියකට අයත් වේ. ඔවුන් අස්ථායි.
මාර්ගය වන විට ඔබට තනි ස්ථිතික පන්ති නිර්මාණය කළ හැකි බව ඔබ දැන සිටියා :)
getInstance()
(බොහෝ විට එය වැදගත් නොවේ ).