"Merhaba, Amigo!"

"Merhaba, Bilaabo!"

"Bugünkü konumuz sadece ilginç olmakla kalmayacak, düpedüz destansı olacak."

"Bugün size tasarım kalıplarının ne olduğunu anlatacağım . "

"Harika! Onlar hakkında çok şey duydum. Sabırsızlıkla bekliyorum!"

"Deneyimli programcılar çok sayıda sınıf yazmak zorundadır. Ancak bu işin en zor kısmı, hangi sınıfların oluşturulacağına ve işin aralarında nasıl paylaştırılacağına karar vermektir."

"Bu tür soruları çözdükçe, bazı çözümlerin iyi, bazılarının ise kötü olduğunu o kadar çok anladılar."

"Kötü çözümler genellikle çözdüklerinden daha fazla sorun yaratırlar. Kötü bir şekilde genişlerler, birçok gereksiz sınırlama yaratırlar, vs. Ve iyi çözümler tam tersidir."

"Yapabileceğin bir benzetme var mı?"

"Diyelim ki bir ev inşa ediyorsunuz. Ve neyden yapılacağını düşünüyorsunuz. Duvarlara, zemine ve tavana ihtiyacınız olduğuna karar veriyorsunuz. Sonuç olarak, düz çatılı bir ev inşa ediyorsunuz. Böyle bir ev çatlar ve çatısı akar. Bu kötü bir çözüm."

"Tersine, temel, duvarlar ve beşik çatıdan oluşan bir ev iyi bir çözüm olacaktır. Kar çatıdan kayacağı için yoğun kar yağışı sorun teşkil etmez. Ve zeminin kayması korkulacak bir şey değildir, çünkü temel Böyle bir çözüme iyi diyeceğiz."

"Teşekkürler görüyorum."

"Tamam. O zaman devam edeceğim."

"Zamanla, iyi çözümler tasarım modelleri olarak bilinmeye başlandı, kötü çözümler ise anti-kalıplar olarak adlandırıldı."

"Tasarım deseni, bir sorunun yanıtı gibidir. Soruyu hiç duymadıysanız anlamak zordur."

" Kalıpların ilk kategorisi yaratıcı kalıplardır. Bu tür kalıplar, nesnelerin yaratılmasıyla ilgili iyi çözümleri tanımlar."

"Nesne yaratmanın nesi bu kadar karmaşık?"

"Olduğu gibi, şimdi keşfedeceğimiz şey bu."

Singleton deseni.

Tasarım kalıpları: singleton, fabrika, fabrika yöntemi, soyut fabrika - 1

"Genellikle programlarda, bazı nesnelerin yalnızca tek bir kopyası bulunabilir. Örneğin, konsol, kaydedici, çöp toplayıcı vb."

" Kötü çözüm: herhangi bir nesne oluşturmayın; yalnızca yöntemleri tamamen statik olan bir sınıf oluşturun."

" İyi çözüm:  tek bir nesne oluşturun ve onu statik bir değişkende saklayın. Sınıfın ikinci bir nesnesinin oluşturulmasını önleyin. Örneğin:"

Örnek
class Sun
{
 private static Sun instance;
 public static Sun getInstance()
 {
  if (instance == null)
  instance = new Sun();

  return instance;
 }

 private Sun()
 {
 }
}
nasıl denir
Sun sun = Sun.getInstance();

"Basit."

"İlk olarak, yapıcıyı özel yapıyoruz. Artık yalnızca sınıfımızın içinden çağrılabilir. Sun sınıfının yöntemleri dışında her yerde Sun nesnelerinin oluşturulmasını engelledik."

"İkincisi, bu sınıfın bir nesnesi yalnızca getInstance() yöntemi çağrılarak elde edilebilir. Bu, bir Sun nesnesi oluşturabilen tek yöntem olmakla kalmaz, aynı zamanda böyle bir nesnenin olmasını da sağlar."

"Anlıyorum."

"Şimdi, bunu tam olarak nasıl yaparım?"

"Teşekkürler. Şimdi her şey netleşmeye başlıyor."

"Bu kalıbı buradan da okuyabilirsiniz  ."

Fabrika kalıbı.

Tasarım kalıpları: tekil, fabrika, fabrika yöntemi, soyut fabrika - 2

"Programcıların çok sık karşılaştığı bir durum. Bazı temel sınıflarınız ve birçok alt sınıfınız var. Örneğin, bir oyun karakter sınıfı (GamePerson) ve onu miras alan tüm diğer karakterler için sınıflar."

"Diyelim ki şu sınıflara sahipsiniz:"

Örnek
abstract class GamePerson
{
}

class Warrior extends GamePerson
{
}

class Mag extends GamePerson
{
}

class Troll extends GamePerson
{
}

class Elf extends GamePerson
{
}

"Soru, bu sınıfların nesnelerinin oluşturulmasını nasıl esnek ve uygun bir şekilde yöneteceğimizdir."

"Bu sorun size abartılı geliyorsa, oyunda düzinelerce kılıç ve kalkan, yüzlerce büyü ve binlerce canavar yaratmanız gerektiğini hayal edin. Burada nesne yaratmaya uygun bir yaklaşım olmadan yapamazsınız. "

" Fabrika kalıbı iyi bir çözüm sunuyor."

"İlk olarak, değerleri çeşitli sınıflara karşılık gelen bir numaralandırma oluşturmamız gerekiyor."

"İkincisi, bir numaralandırma değerine dayalı olarak nesne(ler) oluşturan statik yöntem(ler)e sahip özel bir Fabrika sınıfı oluşturun."

"Örneğin:"

Örnek
public enum PersonType
{
 UNKNOWN,
 WARRIOR,
 MAG,
 TROLL,
 ELF,
}

public class PersonFactory
{
 public static GamePerson createPerson(PersonType personType)
 {
  switch(personType)
  {
   WARRIOR:
   return new Warrior();
   MAG:
   return new Mag();
   TROLL:
   return new Troll();
   ELF:
   return new Elf();
   default:
   throw new GameException();
  }
 }
}
nasıl denir
GamePerson person = PersonFactory.createPerson(PersonType.MAG);

"Başka bir deyişle, nesne oluşturmayı yönetmek için özel bir sınıf mı oluşturduk?"

"Evet."

"Peki bu ne gibi avantajlar sağlıyor?"

"İlk olarak, bu sınıfta nesneler gerekli verilerle başlatılabilir."

"İkincisi, istenen nesneyi nihai olarak yaratmak için gerekli enum değerini yöntemler arasında istediğiniz kadar iletebilirsiniz."

"Üçüncüsü, enum alanlarının sayısı sınıf sayısıyla eşleşmek zorunda değildir. Birçok karakter türü olabilir, ancak birkaç sınıf olabilir."

"Örneğin, bir Mag & Warrior, bir sınıf (İnsan) kullanabilir, ancak farklı güç ve sihir özelliklerine (yapıcı argümanları) sahip olabilir."

"İşte şöyle görünebilir (anlaşılması için kara elfler de ekledim):"

Örnek
public enum PersonType
{
 UNKNOWN,
 WARRIOR,
 MAG,
 TROLL,
 ELF,
 DARK_ELF
}

public class PersonFactory
{
 public static GamePerson createPerson(PersonType personType)
 {
  switch(personType)
  {
   WARRIOR:
   return new Human(10, 0); // Strength, magic
   MAG:
   return new Human(0, 10); // Strength, magic
   TROLL:
   OGR:
   return new Troll();
   ELF:
   return new Elf(true); // true – good, false – evil
   DARK_ELF:
   return new Elf(false); // true – good, false – evil
   default:
   throw new GameException();
  }
 }
}
nasıl denir
GamePerson person = PersonFactory.createPerson(PersonType.MAG);

"Yukarıdaki örnekte, altı farklı türde nesne oluşturmak için yalnızca üç sınıf kullandık. Bu çok uygun. Ayrıca, tüm bu mantığı tek bir sınıf ve tek bir yöntemde yoğunlaştırdık."

"Şimdi, Ogre için ayrı bir sınıf oluşturmaya karar verdiğimizi varsayalım - burada yalnızca birkaç satır kod değiştireceğiz, uygulamanın yarısını değil."

"Katılıyorum. Bu iyi bir çözüm."

"Ben de bundan bahsediyorum: tasarım kalıpları, iyi çözümlerin koleksiyonlarıdır."

"Keşke onları nerede kullanacağımı bilseydim..."

"Evet. Katılıyorum, hemen anlamayacaksın. Yine de, bilmeyip yapamamaktansa bilip de yapamamak daha iyidir. İşte size bu kalıpla ilgili faydalı bir link daha: Fabrika Kalıbı "

"Oh teşekkürler."

" Soyut fabrika modeli."

"Bazen çok fazla nesneniz olduğunda, fabrikalar için bir fabrika yaratma fikri akla gelir. Böyle bir fabrikaya soyut fabrika denir ."

"Buna nerede ihtiyaç duyulacak?!"

"Birkaç özdeş nesne grubunuz olduğunu varsayalım. Bunu bir örnekle göstermek daha kolay."

"Şimdi, diyelim ki oyununuzda üç ırk var: insanlar, elfler ve iblisler. Ve denge için, her ırkın savaşçıları, okçuları ve büyücüleri var. Bir oyuncu yalnızca oynadığı ırka ait nesneler yaratabilir. oyunda. İşte kodda nasıl görüneceği:"

Asker sınıflarının beyanı
class Warrior
{
}
class Archer
{
}
class Mag
{
}
insanlar
class HumanWarrior extends Warrior
{
}

class HumanArcher extends Archer
{
}

class HumanMag extends Mag
{
}
elfler
class ElfWarrior extends Warrior
{
}

class ElfArcher extends Archer
{
}

class ElfMag extends Mag
{
}
şeytanlar
class DaemonWarrior extends Warrior
{
}

class DaemonArcher extends Archer
{
}

class DaemonMag extends Mag
{
}

Şimdi ırkları oluşturalım ya da onlara ordular da diyebiliriz.

Ordular
abstract class Army
{
 public Warrior createWarrior();
 public Archer createArcher();
 public Mag createMag();
}
insan ordusu
class HumanArmy extends Army
{
 public Warrior createWarrior()
 {
  return new HumanWarrior();
 }
 public Archer createArcher()
 {
  return new HumanArcher();
 }
 public Mag createMag()
 {
  return new HumanMag();
 }
}
cin ordusu
class ElfArmy extends Army
{
 public Warrior createWarrior()
 {
  return new ElfWarrior();
 }
 public Archer createArcher()
 {
  return new ElfArcher();
 }
 public Mag createMag()
 {
  return new ElfMag();
 }
}
iblis ordusu
class DaemonArmy extends Army
{
 public Warrior createWarrior()
 {
  return new DaemonWarrior();
 }
 public Archer createArcher()
 {
  return new DaemonArcher();
 }
 public Mag createMag()
 {
  return new DaemonMag();
 }
}

"Ama bunu nasıl kullanıyorsun?"

"Ordu, Savaşçı, Okçu ve Büyücü sınıflarını programın herhangi bir yerinde kullanabilir ve gerekli nesneleri yaratmak için, istediğiniz Ordu alt sınıfından bir nesneyi iletmeniz yeterlidir."

"Örneğin:"

Örnek
Army humans = new HumanArmy();
Army daemons = new DaemonArmy();

Army winner = FightSimulator.simulate(humans, daemons);

"Yukarıdaki örnekte, farklı ırklar (ordular) arasındaki savaşları simüle eden bir sınıfımız var. Sadece iki Ordu nesnesini geçmeniz gerekiyor. Sınıfın kendisi bunları çeşitli birlikler oluşturmak için kullanıyor ve galibi belirlemek için aralarında sanal savaşlar yürütüyor. ."

"Anlıyorum. Teşekkürler. Gerçekten ilginç bir yaklaşım."

"Ne derseniz deyin, iyi bir çözüm."

"Evet."

"Konuyla ilgili başka bir iyi bağlantı:  Soyut fabrika modeli "