Pada ketika ini, anda mungkin telah menemui corak reka bentuk. Contohnya, singleton .

Mari kita ingat kembali apakah corak, mengapa ia diperlukan, dan apakah corak ciptaan (singleton ialah satu contoh). Kami juga akan mengkaji corak baharu: kaedah kilang.

Dalam pembangunan perisian, corak reka bentuk ialah binaan seni bina berulang yang mewakili penyelesaian kepada masalah reka bentuk dalam beberapa konteks berulang.

Biasanya, corak bukanlah penyelesaian akhir yang boleh ditukar terus kepada kod. Ia hanyalah model penyelesaian kepada masalah yang boleh digunakan dalam pelbagai situasi.

Corak ciptaan ialah corak reka bentuk yang berurusan dengan proses mencipta objek. Mereka memungkinkan untuk mencipta sistem yang bebas daripada kaedah yang digunakan untuk mencipta, mengarang dan mempersembahkan objek.

Kaedah kilang ialah corak reka bentuk ciptaan yang mentakrifkan antara muka biasa untuk mencipta objek dalam kelas induk, memberikan keturunannya keupayaan untuk mencipta objek ini. Pada masa penciptaan, keturunan boleh menentukan kelas yang hendak dibuat.

Apakah masalah yang diselesaikan oleh corak?

Bayangkan anda membuat keputusan untuk membuat program penghantaran. Pada mulanya, anda akan mengupah kurier dengan kereta dan menggunakan akeretamembantah untuk mewakili kenderaan penghantaran dalam program. Kurir menghantar pakej dari titik A ke titik B dan seterusnya. Senang kacang.

Program ini semakin popular. Perniagaan anda sedang berkembang dan anda ingin berkembang ke pasaran baharu. Sebagai contoh, anda boleh mula juga menghantar makanan dan penghantaran barang. Dalam kes ini, makanan boleh dihantar melalui kurier dengan berjalan kaki, dengan skuter dan basikal, tetapi trak diperlukan untuk pengangkutan.

Kini anda perlu menjejaki beberapa perkara (bila, kepada siapa, apa dan berapa banyak yang akan dihantar), termasuk jumlah yang boleh dibawa oleh setiap kurier. Mod pengangkutan baharu mempunyai kelajuan dan kapasiti yang berbeza. Kemudian anda dapati bahawa kebanyakan entiti dalam program anda sangat terikat dengankeretakelas. Anda sedar bahawa untuk menjadikan program anda berfungsi dengan kaedah penghantaran lain, anda perlu menulis semula pangkalan kod sedia ada dan melakukannya sekali lagi setiap kali anda menambah kenderaan baharu.

Hasilnya ialah kod mengerikan yang dipenuhi dengan pernyataan bersyarat yang melakukan tindakan berbeza bergantung pada jenis pengangkutan.

Penyelesaian

Corak kaedah kilang mencadangkan mencipta objek dengan memanggil kaedah kilang khas dan bukannya terus menggunakan operator baharu . Subkelas kelas yang mempunyai kaedah kilang boleh mengubah suai objek yang dicipta bagi kenderaan tertentu. Pada pandangan pertama, ini mungkin kelihatan tidak berguna: kami hanya memindahkan panggilan pembina dari satu tempat dalam program ke tempat lain. Tetapi kini anda boleh mengatasi kaedah kilang dalam subkelas untuk menukar jenis pengangkutan yang dibuat.

Mari lihat gambarajah kelas untuk pendekatan ini:

Untuk sistem ini berfungsi, semua objek yang dikembalikan mesti mempunyai antara muka yang sama. Subkelas akan dapat menghasilkan objek kelas berbeza yang melaksanakan antara muka ini.

Sebagai contoh, kelas Lori dan Kereta melaksanakan antara muka CourierTransport dengan kaedah penghantaran . Setiap kelas ini melaksanakan kaedah dengan cara yang berbeza: trak menghantar barang, manakala kereta menghantar makanan, bungkusan dan sebagainya. Kaedah kilang dalam kelas TruckCreator mengembalikan objek trak dan kelas CarCreator mengembalikan objek kereta.

Untuk pelanggan kaedah kilang, tiada perbezaan antara objek ini, kerana ia akan menganggapnya sebagai sejenis abstrak CourierTransport . Pelanggan akan sangat mengambil berat bahawa objek mempunyai kaedah untuk menyampaikan, tetapi bagaimana sebenarnya kaedah itu berfungsi adalah tidak penting.

Pelaksanaan di Jawa:


public interface CourierTransport {
	void deliver();
}
public class Car implements CourierTransport {
	@Override
	public void deliver() {
    		System.out.println("The package is being delivered by car");
	}
}
public class Truck implements CourierTransport {
	@Override
	public void deliver() {
    		System.out.println("The freight is being delivered by truck");
	}
}
public abstract class CourierTransportCreator {
	public abstract CourierTransport createTransport();
}
public class CarCreator extends CourierTransportCreator {
	@Override
	public CourierTransport createTransport() {
    		return new Car();
	}
}
public class TruckCreator extends CourierTransportCreator {
	@Override
	public CourierTransport createTransport() {
    		return new Truck();
	}
}
 
public class Delivery {
	private String address;
	private CourierTransport courierTransport;
 
	public void Delivery() {
	}
 
	public Delivery(String address, CourierTransport courierTransport) {
    	this.address = address;
    	this.courierTransport = courierTransport;
	}
 
	public CourierTransport getCourierTransport() {
    		return courierTransport;
	}
 
	public void setCourierTransport(CourierTransport courierTransport) {
    		this.courierTransport = courierTransport;
	}
 
	public String getAddress() {
    		return address;
	}
 
	public void setAddress(String address) {
    		this.address = address;
	}
}
public static void main(String[] args) {
    	// Accept a new type of order from the database (pseudocode)
    	String type = database.getTypeOfDeliver();
 
    	Delivery delivery = new Delivery();
    	
    	// Set the transport for delivery
        delivery.setCourierTransport(getCourierTransportByType(type));
    	
    	// Make the delivery
        delivery.getCourierTransport().deliver();
 
	}
 
	public static CourierTransport getCourierTransportByType(String type) {
    	switch (type) {
        	case "CarDelivery":
            	return new CarCreator().createTransport();
        	case "TruckDelivery":
            	return new TruckCreator().createTransport();
        	default:
            	throw new RuntimeException();
	    }
	}
    

Jika kita ingin mencipta objek penghantaran baharu, maka program secara automatik mencipta objek pengangkutan yang sesuai.

Bilakah kita harus menggunakan corak ini?

1. Apabila anda tidak mengetahui terlebih dahulu jenis dan kebergantungan objek yang perlu digunakan oleh kod anda.

Kaedah kilang memisahkan kod untuk menghasilkan bentuk pengangkutan daripada kod yang menggunakan pengangkutan. Akibatnya, kod untuk mencipta objek boleh dilanjutkan tanpa menyentuh kod yang lain.

Contohnya, untuk menambah sokongan bagi jenis pengangkutan baharu, anda perlu mencipta subkelas baharu dan menentukan kaedah kilang di dalamnya yang mengembalikan contoh pengangkutan baharu.

2. Apabila anda ingin menyimpan sumber sistem dengan menggunakan semula objek sedia ada dan bukannya mencipta yang baharu.

Masalah ini biasanya berlaku apabila bekerja dengan objek intensif sumber, seperti sambungan pangkalan data, sistem fail, dsb.

Fikirkan langkah yang perlu anda ambil untuk menggunakan semula objek sedia ada:

  1. Pertama, anda perlu mencipta repositori kongsi untuk menyimpan semua objek yang anda buat.

  2. Apabila meminta objek baharu, anda perlu melihat dalam repositori dan semak sama ada ia mengandungi objek yang tersedia.

  3. Kembalikan objek kepada kod klien.

  4. Tetapi jika tiada objek yang tersedia, buat yang baharu dan tambahkannya ke repositori.

Semua kod ini perlu diletakkan di tempat yang tidak akan mengacaukan kod pelanggan. Tempat yang paling mudah ialah pembina, kerana kita hanya memerlukan semua semakan ini semasa mencipta objek. Malangnya, pembina sentiasa mencipta objek baharu — ia tidak boleh mengembalikan objek sedia ada.

Ini bermakna kaedah lain diperlukan yang boleh mengembalikan kedua-dua objek sedia ada dan baharu. Ini akan menjadi kaedah kilang.

3. Apabila anda ingin membenarkan pengguna memanjangkan bahagian rangka kerja atau pustaka anda.

Pengguna boleh melanjutkan kelas rangka kerja anda melalui warisan. Tetapi bagaimana anda membuat rangka kerja mencipta objek bagi kelas baharu ini dan bukannya yang standard?

Penyelesaiannya adalah untuk membenarkan pengguna memanjangkan bukan sahaja komponen, tetapi juga kelas yang mencipta komponen tersebut. Dan untuk ini, kelas mencipta mesti mempunyai kaedah penciptaan khusus yang boleh ditakrifkan.

Kelebihan

  • Mengasingkan kelas daripada kelas pengangkutan tertentu.
  • Menyimpan kod untuk membuat bentuk pengangkutan di satu tempat, menjadikan kod lebih mudah untuk diselenggara.
  • Memudahkan penambahan mod pengangkutan baharu kepada program.
  • Melaksanakan prinsip terbuka-tertutup.

Keburukan

Boleh membawa kepada hierarki kelas selari yang besar, kerana setiap kelas produk mesti mempunyai subkelas penciptanya sendiri.

Mari kita ringkaskan

Anda mempelajari tentang corak kaedah kilang dan melihat satu kemungkinan pelaksanaan. Corak ini sering digunakan dalam pelbagai perpustakaan yang menyediakan objek untuk mencipta objek lain.

Gunakan corak kaedah kilang apabila anda ingin menambah objek baharu subkelas kelas sedia ada dengan mudah untuk berinteraksi dengan logik perniagaan utama anda dan tidak membebankan kod anda kerana konteks yang berbeza.