JavaRush /Java блогу /Random-KY /Patterns жана Singleton - аларды биринчи жолу көргөндөрдү...

Patterns жана Singleton - аларды биринчи жолу көргөндөрдүн бардыгы үчүн

Группада жарыяланган
SingletonБул макала оймо-чийме түшүнүгүн биринчи жолу жолуктурган, 'e жөнүндө уккан же кандайдыр бир жол менен жасаган, бирок дагы эле эч нерсени түшүнбөгөндөргө багытталган . Кош келдиңиз! JavaRush студенттери 15-деңгээлде биринчи жолу калыпка туш болушат, күтүлбөгөн жерден капHow жалкоо Singletonишке ашыруу менен үлгүнү "оңдоону" жана ишке ашырууну суранат. Бул тууралуу биринчи жолу уккан студенттерде Singletonдароо көптөгөн суроолор пайда болот: үлгү деген эмне, ал эмне үчүн керек, бул кандай үлгү Singletonжана акырында бул кандай жалкоолук. Жоопту ирети менен баштайлы: Patterns жана Singleton - аларды биринчи жолу көргөндөрдүн бардыгы үчүн - 1

Кантсе да үлгү деген эмне?

Жакшыраак түшүнүү үчүн бул суроого тарыхтан жооп берүү керек деп ойлойм. Программисттердин арасында ушундай атактуу төрт автор бар: Эрих Гамма, Ричард Хелм, Ральф Джонсон жана Джон Влиссайдс, алар кызыктуу идея менен чыгышкан.
Patterns жана Singleton - аларды биринчи жолу көргөндөрдүн бардыгы үчүн - 2
Алар программаларды жазууда көп учурда болжол менен бирдей маселелерди чечүүгө жана түзүмү боюнча бир типтеги codeду жазууга туура келгенин байкашкан. Ошондуктан, алар an objectиге багытталган программалоодо көп колдонулган типтүү калыптарды үлгү түрүндө сүрөттөп берүүнү чечишти. Китеп 1995-жылы «Объектке багытталган долбоорлоо техникасы. Дизайн үлгүлөрү" . Китептин аталышы өтө узун болуп чыгып, ал жөн эле " Төрттүн бандасынын китеби " деп аталып калган . Биринчи басылышында 23 үлгү басылып чыккан, андан кийин ондогон башкалары табылган. Ошентип, бул абзацтагы суроого жооп берип, "Үлгүлөр деген эмне?" , келгиле, бир нече сөз менен жыйынтыктайлы:
Үлгү - бул жалпы көйгөйдүн стандартташтырылган чечими.
Жана Singletonбул үлгүлөрдүн бири гана.

Эмне үчүн бизге үлгүлөр керек (дизайн үлгүлөрү)

Сиз калыптарды билбей эле программалай аласыз; муну JavaRushтин 15-деңгээлинде жүздөгөн мини-программаларды алардын бар экендиги жөнүндө эч нерсе билбей туруп жазганыңызды түшүнүү менен текшере аласыз. Бул оюм-чийимдин бир түрү экендигин көрсөтүп турат, анын болушу чеберди үйрөнчүктөн айырмалап турат:
Patterns жана Singleton - аларды биринчи жолу көргөндөрдүн бардыгы үчүн - 3
Үлгүлөр типтүү маселелердин бирин кантип туура чечүү керектигин сүрөттөйт. Натыйжада, үлгүлөрдү билүү убакытты үнөмдөйт. Аналогияны алгоритмдер менен жасоого болот. Мисалы, сиз блэкджек жана сандар менен өзүңүздүн сорттоо алгоритмиңизди ойлоп таап , ага көп убакыт коротсоңуз болот, же сиз буга чейин көп убакыт мурун сүрөттөлгөн алгоритмди колдонуп, аны ишке ашырсаңыз болот. Бул үлгүлөр менен бирдей. Мындан тышкары, үлгүлөрдү колдонуу менен code бир кыйла стандартташтырылган жана туура үлгүлөрдү колдонууда ката кетиришиңиз азыраак болот, анткени алар мурда эле алдын ала айтылган жана бул үлгүдө жок кылынган. Ооба, плюс баары, үлгүлөрдү билүү программисттерге бири-бирин жакшыраак түшүнүүгө мүмкүндүк берет. Программисттериңизге эмне кылууну каалап жатканыңызды түшүндүрүүгө аракет кылбай, жөн гана калыптын атын айтуу жетиштүү. Ошентип, кыскача айтканда, дизайн үлгүлөрү жардам берет:
  • дөңгөлөктү кайра ойлоп таппаңыз, бирок стандарттуу чечимдерди колдонуңуз;
  • codeду стандартташтыруу;
  • терминологияны стандартташтыруу;
Бул бөлүмдүн корутундусунда, биз үлгүлөрдүн бардык ар түрдүүлүгү үч чоң топко жөнөкөйлөтүлүшү мүмкүн экенин белгилей кетүү керек:
Patterns жана Singleton - аларды биринчи жолу көргөндөрдүн бардыгы үчүн - 4

Акыр-аягы, Singleton үлгүсү

Singletonгенеративдик үлгүлөрдү билдирет . Анын сөзмө-сөз котормосу жалгыз. Бул үлгү класста бир гана an object (класстын бир нускасы) бар экенин жана ал an objectке глобалдык кирүү чекити камсыздалышын камсыздайт. Сүрөттөмөдөн бул үлгү эки учурда колдонулушу керек экени айкын болушу керек:
  1. сиздин программаңызда кандайдыр бир класстын бирден ашык an objectи түзүлбөшү керек. Мисалы, компьютердик оюнда сизде “Карактер” классы бар жана бул класста каармандын өзүн сүрөттөгөн бир гана an object болушу керек.

  2. класс an objectисине глобалдык кирүү чекити менен камсыз кылуу керек болгондо. Башкача айтканда, an object программанын каалаган жеринен чакырылганына ынанышыңыз керек. Жана, тилекке каршы, бул үчүн жөн гана глобалдык өзгөрмө түзүү жетишсиз, анткени ал жазуудан корголгон эмес жана ар бир адам бул өзгөрмөнүн маанисин өзгөртө алат жана an objectке глобалдык кирүү чекити жоголот. Бул касиеттер Singleton, мисалы, сизде маалымат базасы менен иштеген класстын an objectи болгондо жана маалымат базасы программанын ар кайсы бөлүктөрүнөн жеткorктүү болушу үчүн керек болгондо керек. Жана Singletonбул класстын мурда түзүлгөн инстанциясын башка эч кандай code алмаштырбаганына кепилдик берет.
Бул эки маселе чечилет Singleton: программада бир an object болушу керек жана ага глобалдык жеткorктүүлүк болушу керек. 15-деңгээлдеги мисалда капHow төмөнкү тапшырма үчүн бул үлгүнү ишке ашырууну суранат (бул жерде анын сүрөттөлүшү):
Patterns жана Singleton - аларды биринчи жолу көргөндөрдүн бардыгы үчүн - 5
Шартты кылдаттык менен окуп чыккандан кийин, Singletonбул жерде эмне үчүн так (Single) керек экени түшүнүктүү болот. Анткени, программа ар бир класстын бир an objectисин түзүүнү суранат: Sun, Moon, Earth. Жана программадагы ар бир класс бирден ашык Күн/Ай/Жерди жаратышы керек деп болжолдоо логикалык жактан туура болот, антпесе, албетте, сиз Жылдыздар согушунун өз versionңызды жазып жатпасаңыз, бул абсурд болот. Үч кадамда Java ишке ашыруунунSingleton өзгөчөлүгү Javaдагы Singleton жүрүм-турумун кадимки конструктордун жардамы менен ишке ашыруу мүмкүн эмес, анткени конструктор дайыма жаңы an objectти кайтарып берет. Ошондуктан, "a" нын бардык ишке ашырылышы Singletonконструкторду жашырууга жана бир an objectтин бар экендигин көзөмөлдөй турган жана бардык жаңы пайда болгон an objectилерди "жок кыла турган" коомдук статикалык ыкманы түзүүгө келет. Эгерде Singleton'a деп аталса, ал жаңы an object түзүшү керек (эгерде ал программада жок болсо) же буга чейин түзүлгөн an objectти кайтарышы керек. Бул үчүн: №1. – Сиз бир an objectти камтыган класска жеке статикалык талааны кошушуңуз керек:
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. – Класстын конструкторун (демейки конструктор) купуя кылыңыз (андан кирүү класстан тышкары жабылып калат, ошондо ал жаңы an objectтерди кайтара алbyte):
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
#3 . – Синглонду алуу үчүн колдонула турган статикалык түзүү ыкмасын жарыялаңыз:
public class LazyInitializedSingleton {
    private static LazyInitializedSingleton instance;
        private LazyInitializedSingleton(){}
        public static LazyInitializedSingleton getInstance(){ // #3
        if(instance == null){		//if the object has not been created yet
            instance = new LazyInitializedSingleton();	//create a new object
        }
        return instance;		// return the previously created object
    }
}
Жогорудагы мисал бир аз олдоксон, анткени биз жөн гана конструкторду жашырып, стандарттуу конструктордун ордуна өзүбүздүн методубузду беребиз. Бул макала JavaRush студенттерине бул үлгү (жана жалпысынан үлгүлөр) менен биринчи жолу байланышууга багытталгандыктан, татаалыраак Singletons ишке ашыруу өзгөчөлүктөрү бул жерде берилбейт. Программанын татаалдыгына жараша, бул үлгүнү деталдуураак тактоо талап кылынышы мүмкүн экенин гана белгилейбиз. Мисалы, көп жиптүү чөйрөдө (Жиктер темасын караңыз) бир эле учурда бир нече түрдүү жиптер Singleton's getter ыкмасын чакыра алат жана жогоруда сүрөттөлгөн code иштебей калат, анткени ар бир жеке жип класстын бир нече инстанцияларын түзө алат. дароо. Ошондуктан, туура Thread-коопсуз синглондорду түзүү үчүн дагы эле бир нече ар кандай ыкмалар бар. Бирок бул башка окуя =) Жана акыры. Жалкоо инициализация деген эмне ? Бул программалоо ыкмасы, анда ресурсту көп талап кылган операция (жана an objectти түзүү - ресурсту көп талап кылган операция) алдын ала эмес, суроо-талап боюнча аткарылат. Бул, негизинен, биздин codeубузда эмне болот Singleton'a. Башкача айтканда, биздин an object алдын ала эмес, ага кирген учурда түзүлөт. Жалкоо инициализация түшүнүгү кандайдыр бир жол менен "ом" менен тыгыз байланышта деп ойлобоо керек Singleton. Жалкоо инициализация башка генеративдик дизайн үлгүлөрүндө да колдонулат, мисалы, прокси жана фабрикалык методдо, бирок бул башка окуя =) Макаланы даярдоодо төмөнкү булактар ​​колдонулган:
  1. Мисалдар менен Java Singleton Дизайн үлгүсү мыкты тажрыйбалары
  2. Дизайн үлгүлөрү
  3. Java тorндеги туура Singleton
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION