"Hai, Amigo!"

"Hai, Bilaabo!"

"Topik kita hari ini tidak hanya menarik - ini akan benar-benar epik."

"Hari ini saya akan memberi tahu Anda apa itu pola desain. "

"Keren! Aku sudah mendengar banyak tentang mereka. Aku tidak sabar!"

"Programmer berpengalaman harus menulis banyak kelas. Tetapi bagian tersulit dari pekerjaan ini adalah memutuskan kelas mana yang akan dibuat dan bagaimana membagi pekerjaan di antara mereka."

"Semakin banyak mereka memecahkan pertanyaan seperti itu, semakin mereka menyadari bahwa beberapa solusi itu baik, sementara yang lain buruk."

"Solusi yang buruk biasanya menciptakan lebih banyak masalah daripada yang mereka selesaikan. Solusi itu meluas dengan buruk, menciptakan banyak batasan yang tidak perlu, dll. Dan solusi yang baik adalah kebalikannya."

"Apakah ada analogi yang bisa kamu buat?"

"Misalkan Anda sedang membangun sebuah rumah. Dan Anda berpikir akan dibuat dari apa. Anda memutuskan bahwa Anda membutuhkan dinding, lantai, dan langit-langit. Akibatnya, Anda membangun rumah dengan atap datar dan tidak pondasi. Rumah seperti itu akan retak, dan atapnya akan bocor. Ini solusi yang buruk."

"Sebaliknya, rumah yang terdiri dari pondasi, dinding, dan atap pelana akan menjadi solusi yang baik. Hujan salju lebat tidak menjadi masalah, karena salju akan meluncur dari atap. Dan tanah yang bergeser tidak perlu ditakuti, karena pondasi akan memastikan stabilitas. Kami akan menyebut solusi seperti itu bagus."

"Aku mengerti. Terima kasih."

"Oke. Kalau begitu aku akan melanjutkan."

"Pada waktunya, solusi yang baik dikenal sebagai pola desain, sedangkan yang buruk disebut anti-pola."

"Pola desain seperti jawaban atas pertanyaan. Sulit dipahami jika Anda belum pernah mendengar pertanyaannya."

" Kategori pola pertama adalah pola penciptaan. Pola seperti itu menjelaskan solusi yang baik terkait dengan penciptaan objek."

"Apa yang begitu rumit tentang membuat objek?"

"Seperti yang terjadi, itulah yang akan kita jelajahi sekarang."

Pola tunggal.

Pola desain: tunggal, pabrik, metode pabrik, pabrik abstrak - 1

"Seringkali dalam program, hanya ada satu salinan dari beberapa objek. Misalnya, konsol, logger, pengumpul sampah, dll."

" Solusi buruk: jangan buat objek apa pun — buat saja kelas yang semua metodenya statis."

" Solusi bagus:  buat satu objek dan simpan dalam variabel statis. Cegah pembuatan objek kedua dari kelas. Misalnya:"

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

  return instance;
 }

 private Sun()
 {
 }
}
Bagaimana itu disebut
Sun sun = Sun.getInstance();

"Itu mudah."

"Pertama, kami menjadikan konstruktornya pribadi. Sekarang konstruktor hanya dapat dipanggil dari dalam kelas kami. Kami telah memblokir pembuatan objek Sun di mana pun kecuali dalam metode kelas Sun."

"Kedua, objek dari kelas ini hanya dapat diperoleh dengan memanggil metode getInstance(). Tidak hanya ini satu-satunya metode yang dapat membuat objek Sun, tetapi juga memastikan bahwa hanya ada satu objek seperti itu."

"Jadi begitu."

"Ketika Anda berpikir, «Sekarang, bagaimana tepatnya saya akan melakukannya?», sebuah pola mengatakan, «Anda dapat mencoba ini — ini adalah salah satu solusi terbaik.»"

"Terima kasih. Sekarang semuanya mulai menjadi jelas."

"Anda juga dapat membaca tentang pola ini  di sini ."

Pola pabrik.

Pola desain: tunggal, pabrik, metode pabrik, pabrik abstrak - 2

"Ini adalah situasi yang sangat sering dihadapi programmer. Anda memiliki beberapa kelas dasar dan banyak subkelas. Misalnya, kelas karakter game (GamePerson) dan kelas untuk semua karakter lain yang mewarisinya."

"Katakanlah Anda memiliki kelas-kelas berikut:"

Contoh
abstract class GamePerson
{
}

class Warrior extends GamePerson
{
}

class Mag extends GamePerson
{
}

class Troll extends GamePerson
{
}

class Elf extends GamePerson
{
}

"Pertanyaannya adalah bagaimana kita secara fleksibel dan nyaman mengelola pembuatan objek dari kelas-kelas ini."

"Jika masalah ini tampak tidak masuk akal bagi Anda, bayangkan dalam gim Anda perlu membuat lusinan pedang dan perisai, ratusan mantra sihir, dan ribuan monster. Anda tidak dapat melakukannya tanpa pendekatan yang nyaman untuk pembuatan objek di sini. "

" Pola Pabrik menawarkan solusi yang bagus."

"Pertama, kita perlu membuat enum yang nilainya sesuai dengan berbagai kelas."

"Kedua, buat kelas Pabrik khusus yang memiliki metode statis yang membuat objek berdasarkan nilai enum."

"Misalnya:"

Contoh
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();
  }
 }
}
Bagaimana itu disebut
GamePerson person = PersonFactory.createPerson(PersonType.MAG);

"Dengan kata lain, kami membuat kelas khusus untuk mengelola pembuatan objek?"

"Ya."

"Jadi apa keuntungan yang diberikan ini?"

"Pertama, di kelas ini, objek dapat diinisialisasi dengan data yang diperlukan."

"Kedua, Anda dapat memberikan nilai enum yang diperlukan antar metode sebanyak yang Anda suka untuk akhirnya membuat objek yang diinginkan."

"Ketiga, jumlah bidang enum tidak harus sesuai dengan jumlah kelas. Mungkin ada banyak jenis karakter, tetapi sedikit kelas."

"Misalnya, seorang Mag & Warrior mungkin menggunakan satu kelas (Manusia), tetapi dengan kekuatan dan sifat sihir yang berbeda (argumen konstruktor)."

"Seperti inilah tampilannya (untuk kejelasan, saya juga menambahkan dark elf):"

Contoh
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();
  }
 }
}
Bagaimana itu disebut
GamePerson person = PersonFactory.createPerson(PersonType.MAG);

"Dalam contoh di atas, kami hanya menggunakan tiga kelas untuk membuat enam jenis objek yang berbeda. Ini sangat nyaman. Terlebih lagi, kami memiliki semua logika ini terkonsentrasi di satu kelas dan satu metode."

"Sekarang misalkan kita memutuskan untuk membuat kelas terpisah untuk Ogre — kita cukup mengubah beberapa baris kode di sini, dan bukan separuh aplikasinya."

"Saya setuju. Itu solusi yang bagus."

"Dan itulah yang saya bicarakan: pola desain adalah kumpulan solusi yang baik."

"Aku juga berharap aku tahu di mana menggunakannya ..."

"Ya. Saya setuju, Anda tidak akan langsung mengerti. Tetap saja, lebih baik tahu dan tidak bisa melakukan daripada tidak tahu dan tidak bisa. Berikut tautan lain yang berguna untuk Anda tentang pola ini: Pola Pabrik "

"Oh terima kasih."

" Pola pabrik abstrak ."

"Terkadang saat Anda memiliki banyak objek, ide untuk membuat pabrik untuk pabrik muncul dengan sendirinya. Pabrik seperti itu disebut pabrik abstrak ."

"Di mana ini dibutuhkan ?!"

"Misalkan Anda memiliki beberapa grup objek yang identik. Ini lebih mudah ditunjukkan dengan sebuah contoh."

"Sekarang, katakanlah Anda memiliki tiga ras dalam gim Anda: manusia, elf, dan setan. Dan untuk keseimbangan, setiap ras memiliki prajurit, pemanah, dan penyihir. Seorang pemain hanya dapat membuat objek milik ras yang dia mainkan untuk dalam game. Begini tampilannya dalam kode:"

Deklarasi kelas prajurit
class Warrior
{
}
class Archer
{
}
class Mag
{
}
Manusia
class HumanWarrior extends Warrior
{
}

class HumanArcher extends Archer
{
}

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

class ElfArcher extends Archer
{
}

class ElfMag extends Mag
{
}
Iblis
class DaemonWarrior extends Warrior
{
}

class DaemonArcher extends Archer
{
}

class DaemonMag extends Mag
{
}

Dan sekarang mari kita buat ras, atau kita juga bisa menyebutnya tentara.

Tentara
abstract class Army
{
 public Warrior createWarrior();
 public Archer createArcher();
 public Mag createMag();
}
Tentara manusia
class HumanArmy extends Army
{
 public Warrior createWarrior()
 {
  return new HumanWarrior();
 }
 public Archer createArcher()
 {
  return new HumanArcher();
 }
 public Mag createMag()
 {
  return new HumanMag();
 }
}
tentara peri
class ElfArmy extends Army
{
 public Warrior createWarrior()
 {
  return new ElfWarrior();
 }
 public Archer createArcher()
 {
  return new ElfArcher();
 }
 public Mag createMag()
 {
  return new ElfMag();
 }
}
Tentara setan
class DaemonArmy extends Army
{
 public Warrior createWarrior()
 {
  return new DaemonWarrior();
 }
 public Archer createArcher()
 {
  return new DaemonArcher();
 }
 public Mag createMag()
 {
  return new DaemonMag();
 }
}

"Tapi bagaimana kamu menggunakan ini?"

"Anda dapat menggunakan kelas Tentara, Pejuang, Pemanah, dan Penyihir di mana saja dalam program ini, dan untuk membuat objek yang diperlukan — cukup berikan objek dari subkelas Angkatan Darat yang diinginkan."

"Misalnya:"

Contoh
Army humans = new HumanArmy();
Army daemons = new DaemonArmy();

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

"Dalam contoh di atas, kami memiliki kelas yang mensimulasikan pertempuran antara ras (tentara) yang berbeda. Anda hanya perlu melewati dua objek Angkatan Darat. Kelas itu sendiri menggunakannya untuk menciptakan berbagai pasukan dan melakukan pertempuran virtual di antara mereka untuk mengidentifikasi pemenangnya ."

"Begitu. Terima kasih. Pendekatan yang sangat menarik."

"Solusi yang bagus, terlepas dari apa yang Anda katakan."

"Ya."

"Berikut adalah tautan bagus lainnya pada topik:  Pola pabrik abstrak "