Corak prototaip
Corak Prototaip digunakan untuk mencipta objek berulang sambil memastikan prestasi. Corak reka bentuk jenis ini ialah corak ciptaan, yang menyediakan cara optimum untuk mencipta objek.
Corak ini melaksanakan antara muka prototaip, yang digunakan untuk mencipta klon objek semasa. Mod ini digunakan apabila kos untuk mencipta objek secara langsung agak tinggi. Sebagai contoh, objek perlu dibuat selepas operasi pangkalan data yang mahal. Kita boleh cache objek, mengembalikan klon pada permintaan seterusnya, dan mengemas kini pangkalan data apabila diperlukan untuk mengurangkan panggilan pangkalan data.
Pengenalan
Niat: Gunakan tika prototaip untuk menentukan jenis objek yang akan dibuat dan cipta objek baharu dengan menyalin prototaip ini.
Penyelesaian utama: Buat dan padam prototaip semasa masa jalan.
Bila digunakan: 1 Apabila sistem harus dicipta, digubah dan diwakili secara bebas daripada produknya. 2. Apabila kelas yang akan digunakan ditentukan pada masa berjalan, contohnya, melalui pemuatan dinamik. 3. Untuk mengelakkan daripada mewujudkan hierarki kelas kilang selari dengan hierarki kelas produk. 4. Apabila contoh kelas hanya boleh mempunyai satu daripada beberapa kombinasi keadaan yang berbeza. Mungkin lebih mudah untuk mencipta bilangan prototaip yang sepadan dan mengklonkannya daripada membuat instantiate kelas secara manual dengan keadaan yang sesuai setiap kali.
Cara menyelesaikan: Gunakan objek prototaip sedia ada untuk menjana tika yang sama dengan objek prototaip dengan cepat.
Kod kunci: 1. Untuk melaksanakan operasi pengklonan, warisi Cloneable dalam JAVA dan gantikan clone(Dalam .NET, anda boleh menggunakan kaedah MemberwiseClone() bagi kelas Object merealisasikan klon cetek objek Salin atau laksanakan salinan dalam melalui bersiri. 2. Corak prototaip juga digunakan untuk mengasingkan hubungan gandingan antara pengguna objek kelas dan jenis tertentu (kelas meruap juga memerlukan "kelas meruap" ini untuk mempunyai antara muka yang stabil.
Contoh aplikasi: 1. 2. Kaedah klon() objek dalam JAVA.
Kelebihan: 1. 2. Melarikan diri daripada kekangan pembina.
Kelemahan: 1. Melengkapkan kaedah pengklonan memerlukan pertimbangan menyeluruh terhadap fungsi kelas Ini tidak sukar untuk kelas baharu, tetapi ia tidak semestinya mudah untuk kelas sedia ada, terutamanya apabila Rujukan kelas tidak menyokong objek tidak langsung bersiri, atau apabila rujukan mengandungi struktur kitaran. 2. Antara muka Boleh Diklon mesti dilaksanakan. 3. Melarikan diri daripada kekangan pembina.
Senario penggunaan: 1. 2. Permulaan kelas memerlukan penghadaman banyak sumber, termasuk data, sumber perkakasan, dsb. 3. Senario dengan prestasi dan keperluan keselamatan. 4. Jika menjana objek melalui baharu memerlukan penyediaan data atau hak akses yang sangat menyusahkan, anda boleh menggunakan mod prototaip. 5. Senario dengan berbilang pengubah suai objek. 6. Apabila objek perlu diakses oleh objek lain, dan setiap pemanggil mungkin perlu mengubah suai nilainya, anda boleh mempertimbangkan untuk menggunakan mod prototaip untuk menyalin berbilang objek untuk digunakan oleh pemanggil. 7. Dalam projek sebenar, corak prototaip jarang muncul bersendirian Ia biasanya muncul bersama-sama dengan corak kaedah kilang Sesuatu objek dicipta melalui kaedah klon, dan kemudian diberikan kepada pemanggil dengan kaedah kilang. Corak prototaip telah disepadukan dengan Java dan boleh digunakan oleh semua orang.
Nota: Tidak seperti membina objek baharu dengan membuat instantiate kelas, corak prototaip menjana objek baharu dengan menyalin objek sedia ada. Salinan cetek mengimplementasikan Boleh Diklon, menulis semula dan salinan dalam boleh Bersiri untuk membaca strim binari.
Pelaksanaan
Kami akan mencipta kelas abstrak Bentuk dan kelas entiti yang memanjangkan kelas Bentuk. Langkah seterusnya ialah mentakrifkan kelas ShapeCache, yang menyimpan objek bentuk dalam Hashtable dan mengembalikan klonnya atas permintaan.
PrototypPatternDemo, kelas demo kami menggunakan kelas ShapeCache untuk mendapatkan objek Shape.
Langkah 1
Buat kelas abstrak yang melaksanakan antara muka Klon.
Shape.java
public abstract class Shape implements Cloneable { private String id; protected String type; abstract void draw(); public String getType(){ return type; } public String getId() { return id; } public void setId(String id) { this.id = id; } public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } }
Langkah 2
Buat kelas entiti yang memanjangkan kelas abstrak di atas.
Rectangle.java
public class Rectangle extends Shape { public Rectangle(){ type = "Rectangle"; } @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
Square.java
public class Square extends Shape { public Square(){ type = "Square"; } @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
Circle.java
public class Circle extends Shape { public Circle(){ type = "Circle"; } @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
Langkah 3
Buat kelas untuk mendapatkan kelas entiti daripada pangkalan data dan simpannya dalam Hashtable.
ShapeCache.java
import java.util.Hashtable; public class ShapeCache { private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>(); public static Shape getShape(String shapeId) { Shape cachedShape = shapeMap.get(shapeId); return (Shape) cachedShape.clone(); } // 对每种形状都运行数据库查询,并创建该形状 // shapeMap.put(shapeKey, shape); // 例如,我们要添加三种形状 public static void loadCache() { Circle circle = new Circle(); circle.setId("1"); shapeMap.put(circle.getId(),circle); Square square = new Square(); square.setId("2"); shapeMap.put(square.getId(),square); Rectangle rectangle = new Rectangle(); rectangle.setId("3"); shapeMap.put(rectangle.getId(),rectangle); } }
Langkah 4
PrototypePatternDemo Gunakan kelas ShapeCache data yang disimpan dalam Klon bentuk dalam Hashtable.
PrototypePatternDemo.java
public class PrototypePatternDemo { public static void main(String[] args) { ShapeCache.loadCache(); Shape clonedShape = (Shape) ShapeCache.getShape("1"); System.out.println("Shape : " + clonedShape.getType()); Shape clonedShape2 = (Shape) ShapeCache.getShape("2"); System.out.println("Shape : " + clonedShape2.getType()); Shape clonedShape3 = (Shape) ShapeCache.getShape("3"); System.out.println("Shape : " + clonedShape3.getType()); } }
Langkah 5
Sahkan output.
Shape : Circle Shape : Square Shape : Rectangle