Kaedah Kilang ialah corak reka bentuk ciptaan yang menyediakan antara muka untuk mencipta objek, tetapi membenarkan subkelas mengubah jenis objek yang akan dicipta. Daripada membuat seketika objek menggunakan baharu, Kaedah Kilang menyerahkan tanggungjawab penciptaan objek kepada subkelas atau kaedah, menggalakkan fleksibiliti dan skalabiliti.
Apabila terdapat keperluan untuk mencipta objek, tetapi anda tidak tahu terlebih dahulu kelas sebenar objek yang akan diperlukan. Aplikasi ini perlu mengendalikan pelbagai jenis objek yang berkongsi tingkah laku biasa tetapi berbeza dalam pelaksanaannya. Selain itu, anda ingin mengelak daripada mengubah suai kod anda setiap kali jenis objek baharu ditambahkan atau apabila cara objek dicipta berubah.
Penciptaan objek yang kompleks: Menghasilkan kelas secara langsung boleh mengikat kod anda dengan pelaksanaan tertentu, menjadikannya tegar dan sukar untuk dikekalkan.
Penciptaan objek dinamik: Dalam banyak kes, jenis objek yang diperlukan mungkin tidak diketahui sehingga masa jalan dan keputusan ini harus fleksibel.
Encapsulation of instantiation: Logik penciptaan objek harus diasingkan daripada kod klien, jadi perubahan dalam cara objek dicipta tidak menjejaskan seluruh sistem.
Skalabiliti: Apabila anda perlu menambah jenis produk baharu (objek), anda mahukan penyelesaian berskala yang mengelakkan pengubahsuaian kod sedia ada.
Bayangkan sebuah kilang kereta tempat anda membuat pesanan untuk kereta, tetapi bergantung pada pilihan anda (cth., elektrik atau gas), kilang itu memasang dan menyediakan anda jenis kereta yang sesuai. Pelanggan tidak perlu mengetahui butiran khusus pemasangan kereta—mereka hanya menerima produk.
package main import ( "fmt" "os" ) // Step 1: Define the Product Interface type Car interface { Drive() string FuelType() string } // Step 2: Concrete Products (Electric Car and Gas Car) type ElectricCar struct{} func (e *ElectricCar) Drive() string { return "Driving an electric car" } func (e *ElectricCar) FuelType() string { return "Powered by electricity" } type GasCar struct{} func (g *GasCar) Drive() string { return "Driving a gas-powered car" } func (g *GasCar) FuelType() string { return "Powered by gasoline" } // Step 3: Define the Factory Interface type CarFactory interface { CreateCar(brand string) Car } type carFactory struct{} func (carFactory *carFactory) CreateCar() Car { carPreference := os.Getenv("CAR_PREFERENCE") if carPreference == "electric" { return &ElectricCar{} } // here we just instantiate the struct, but you could also // have another functions to help create the object if it's complex return &GasCar{} } // Step 4: Client Code func main() { // Client uses the factory to create objects carFactory := carFactory{} // Creating a Gas Car gasCar := carFactory.CreateCar() fmt.Println(gasCar.Drive()) // Output: Driving a gas-powered car fmt.Println(gasCar.FuelType()) // Output: Powered by gasoline // Creating an Electric Car os.Setenv("CAR_PREFERENCE", "electric") electricCar := carFactory.CreateCar() fmt.Println(electricCar.Drive()) // Output: Driving an electric car fmt.Println(electricCar.FuelType()) // Output: Powered by electricity }
Antara Muka Produk: Mentakrifkan antara muka biasa (Kereta) dengan kaedah Drive() dan FuelType().
Produk Konkrit: Melaksanakan antara muka dengan kelas tertentu (ElectricCar, GasCar) yang menentukan tingkah laku mereka.
Antara Muka Kilang: Menentukan kaedah (CreateCar()) untuk mencipta objek Kereta.
Logik Kilang: Kilang menentukan jenis kereta yang hendak dibuat berdasarkan pilihan pelanggan. Ini ditunjukkan di sini dengan menggunakan pembolehubah persekitaran, tetapi ia boleh berdasarkan mana-mana logik.
Kod Pelanggan: Meminta kereta dari kilang tanpa mengetahui butiran penciptaan, menggunakan objek yang dikembalikan melalui antara muka biasa.
Atas ialah kandungan terperinci Go Design Corak #Kilang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!