Membuat Kacang Musim Semi Melalui Metode Pabrik

1. Perkenalan

Metode pabrik dapat menjadi teknik yang berguna untuk menyembunyikan logika pembuatan kompleks dalam satu panggilan metode.

Meskipun kami biasanya membuat kacang di Spring menggunakan konstruktor atau injeksi lapangan, kami juga dapat membuat kacang Spring menggunakan metode pabrik .

Dalam tutorial ini, kita akan mempelajari cara membuat kacang musim semi menggunakan metode instan dan pabrik statis.

2. Metode Pabrik Instance

Implementasi standar dari pola metode pabrik adalah membuat metode instan yang mengembalikan kacang yang diinginkan.

Selain itu, kita dapat mengkonfigurasi Spring untuk membuat kacang yang kita inginkan dengan atau tanpa argumen .

2.1. Tanpa Argumen

Kita dapat membuat kelas Foo yang mewakili kacang kita sedang dibuat:

public class Foo {}

Kemudian, kami membuat kelas InstanceFooFactory yang menyertakan metode pabrik, createInstance , yang membuat kacang Foo kami :

public class InstanceFooFactory { public Foo createInstance() { return new Foo(); } }

Setelah itu, kami mengonfigurasi Spring:

  1. Buat kacang untuk kelas pabrik kami ( InstanceFooFactory )
  2. Gunakan atribut kacang pabrik untuk mereferensikan kacang pabrik kami
  3. Gunakan atribut metode pabrik untuk mereferensikan metode pabrik kami ( createInstance )

Menerapkan ini ke konfigurasi Spring XML, kita berakhir dengan:

Terakhir, kami melakukan autowire kacang Foo yang kami inginkan . Spring kemudian akan membuat kacang kami menggunakan metode pabrik createInstance kami :

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/factorymethod/instance-config.xml") public class InstanceFooFactoryIntegrationTest { @Autowired private Foo foo; @Test public void givenValidInstanceFactoryConfig_whenCreateFooInstance_thenInstanceIsNotNull() { assertNotNull(foo); } }

2.2. Dengan Argumen

Kami juga dapat memberikan argumen ke metode pabrik contoh kami menggunakan elemen argumen- konstruktor dalam konfigurasi Spring kami.

Pertama, kami membuat kelas, Bar , yang menggunakan argumen:

public class Bar { private String name; public Bar(String name) { this.name = name; } // ...getters & setters }

Selanjutnya, kami membuat kelas pabrik instance, InstanceBarFactory , dengan metode pabrik yang menerima argumen dan mengembalikan kacang Bar :

public class InstanceBarFactory { public Bar createInstance(String name) { return new Bar(name); } }

Terakhir, kami menambahkan elemen konstruktor-arg ke definisi kacang Bar kami :

Kami kemudian dapat melakukan autowire kacang Bar kami dengan cara yang sama seperti yang kami lakukan untuk kacang Foo kami :

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/factorymethod/instance-bar-config.xml") public class InstanceBarFactoryIntegrationTest { @Autowired private Bar instance; @Test public void givenValidInstanceFactoryConfig_whenCreateInstance_thenNameIsCorrect() { assertNotNull(instance); assertEquals("someName", instance.getName()); } }

3. Metode Pabrik Statis

Kami juga dapat mengonfigurasi Spring untuk menggunakan metode statis sebagai metode pabrik.

Meskipun metode pabrik contoh sebaiknya lebih disukai, teknik ini dapat berguna jika kami memiliki metode statis lama yang menghasilkan biji yang diinginkan. Misalnya, jika metode pabrik mengembalikan singleton, kita bisa mengonfigurasi Spring untuk menggunakan metode pabrik tunggal ini.

Mirip dengan metode pabrik instance, kita dapat mengonfigurasi metode statis dengan dan tanpa argumen.

3.1. Tanpa Argumen

Dengan menggunakan kelas Foo sebagai kacang yang kita inginkan, kita dapat membuat kelas, SingletonFooFactory , yang menyertakan metode pabrik createInstance yang mengembalikan instance tunggal Foo :

public class SingletonFooFactory { private static final Foo INSTANCE = new Foo(); public static Foo createInstance() { return INSTANCE; } }

Kali ini kita hanya perlu membuat satu biji. Kacang ini hanya membutuhkan dua atribut:

  1. class - mendeklarasikan kelas pabrik kami ( SingletonFooFactory )
  2. factory-method - mendeklarasikan metode pabrik statis ( createInstance )

Menerapkan ini ke konfigurasi Spring XML kami, kami mendapatkan:

Terakhir, kami membuat autowire kacang Foo kami menggunakan struktur yang sama seperti sebelumnya:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/factorymethod/static-foo-config.xml") public class SingletonFooFactoryIntegrationTest { @Autowired private Foo singleton; @Test public void givenValidStaticFactoryConfig_whenCreateInstance_thenInstanceIsNotNull() { assertNotNull(singleton); } }

3.2. Dengan Argumen

Meskipun kita harus menghindari mengubah status objek statis - seperti singleton kita - bila memungkinkan , kita masih bisa meneruskan argumen ke metode pabrik statis kita.

Untuk melakukan ini, kami membuat metode pabrik baru yang menerima argumen yang kami inginkan:

public class SingletonBarFactory { private static final Bar INSTANCE = new Bar("unnamed"); public static Bar createInstance(String name) { INSTANCE.setName(name); return INSTANCE; } }

Setelah itu, kami mengonfigurasi Spring untuk meneruskan argumen yang diinginkan menggunakan elemen konstruktor-arg :

Terakhir, kami melakukan autowire kacang Bar kami menggunakan struktur yang sama seperti sebelumnya:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/factorymethod/static-bar-config.xml") public class SingletonBarFactoryIntegrationTest { @Autowired private Bar instance; @Test public void givenValidStaticFactoryConfig_whenCreateInstance_thenNameIsCorrect() { assertNotNull(instance); assertEquals("someName", instance.getName()); } }

4. Kesimpulan

Di artikel ini, kami melihat cara mengonfigurasi Spring untuk menggunakan instance dan metode pabrik statis - baik dengan dan tanpa argumen.

Meskipun membuat kacang melalui konstruktor dan injeksi lapangan lebih umum, metode pabrik dapat berguna untuk langkah-langkah pembuatan yang kompleks dan kode warisan.

Kode yang digunakan dalam artikel ini dapat ditemukan di GitHub.