原型設計模式
阿新 • • 發佈:2020-08-05
1.說明
原型(Prototype)模式的定義如下:用一個已經建立的例項作為原型,通過複製該原型物件來建立一個和原型相同或相似的新物件。在這裡,原型例項指定了要建立的物件的種類。用這種方式建立物件非常高效,根本無須知道物件建立的細節。
二:實現
1.結構
由於Java提供了物件的 clone() 方法,所以用 Java 實現原型模式很簡單。
1. 模式的結構
原型模式包含以下主要角色。
- 抽象原型類:規定了具體原型物件必須實現的介面。
- 具體原型類:實現抽象原型類的 clone() 方法,它是可被複制的物件。
- 訪問類:使用具體原型類中的 clone() 方法來複制新的物件。
2.圖
3.程式實現
//具體原型類 class Realizetype implements Cloneable { Realizetype() { System.out.println("具體原型建立成功!"); } public Object clone() throws CloneNotSupportedException { System.out.println("具體原型複製成功!"); return (Realizetype)super.clone(); } } //原型模式的測試類 public class PrototypeTest { public static void main(String[] args)throws CloneNotSupportedException { Realizetype obj1=new Realizetype(); Realizetype obj2=(Realizetype)obj1.clone(); System.out.println("obj1==obj2?"+(obj1==obj2)); } }
三:額外補充【如何使用深拷貝】
1.步驟
先讓引用的物件實現Cloneable
然後再呼叫的物件裡重新賦值
2.程式
package com.jun.design.psknowledge; import lombok.Data; @Data public class Person implements Cloneable{ private String name; private Integer age; private Address address; @Override protected Object clone() throws CloneNotSupportedException { Person person = (Person)super.clone(); person.address = (Address)address.clone(); return person; } }
package com.jun.design.psknowledge; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Address implements Cloneable{ /** * 省 */ private String province; /** * 市 */ private String city; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
package com.jun.design.psknowledge; public class Main { public static void main(String[] args) throws CloneNotSupportedException { deepCopy(); } private static void deepCopy() throws CloneNotSupportedException { Person person = new Person(); person.setName("tom"); person.setAge(20); person.setAddress(new Address("江蘇", "南京")); Person clonePerson = (Person)person.clone(); clonePerson.setAge(22); System.out.println(clonePerson); } }
效果:
Connected to the target VM, address: '127.0.0.1:53519', transport: 'socket' Person(name=tom, age=22, address=Address(province=江蘇, city=南京)) Disconnected from the target VM, address: '127.0.0.1:53519', transport: 'socket' Process finished with exit code 0