原型模式用于创建重复的对象,属于创建型模式。
它通过一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的方式来创建出更多相同类型的对象。
包含
- 抽象原型类:原型对象必须实现的接口。
- 具体原型类:实现抽象原型类中的方法,它就是可以被克隆的对象。
- 访问类:使用具体原型类中的clone方法来克隆对象。
/**
 * 具体原型类
 * 其实现的Cloneable接口就是抽象原型类
 * @author : hafuhafu
 * @date : 2019/9/18 09:57
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Phone implements Cloneable {
    private String name;
    private Double price;
    private String brand;
    private ArrayList<Object> task = new ArrayList<>();
    public void show() {
        System.out.println("show phone message:" + this.toString());
    }
    @Override
    protected Object clone() {
        try {
            var object = super.clone();
            return object;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}/**
 * 访问类
 * 该类使用具体原型类的clone方法产生克隆对象
 * @author : hafuhafu
 * @date : 2019/9/18 10:09
 */
public class PhoneRepository {
    public static final String IPHONE = "iPhone";
    public static final String MI = "Xiao Mi";
    public static final String HW = "Hua Wei";
    private static HashMap<String, Phone> phoneHashMap = new HashMap<>();
    public static Phone getPhone(String brand) {
        Phone phone = phoneHashMap.get(brand);
        return ((Phone) phone.clone());
    }
    public static void initCache() {
        Iphone iphone = new Iphone();
        iphone.setName("iPhone11 Pro Max");
        iphone.setPrice(8599d);
        MiPhone miPhone = new MiPhone();
        miPhone.setName("Xiao Mi mix4");
        miPhone.setPrice(5000d);
        HwPhone hwPhone = new HwPhone();
        hwPhone.setName("Hua Wei Mate30 Pro");
        hwPhone.setPrice(6500d);
        phoneHashMap.put(iphone.getBrand(), iphone);
        phoneHashMap.put(miPhone.getBrand(), miPhone);
        phoneHashMap.put(hwPhone.getBrand(), hwPhone);
    }
}要求
原型模式需要对象实现一个可以克隆(Clone)自身的接口。
原型模式的克隆又分为浅克隆和深克隆两种。
浅克隆
通过原有对象创建一个新对象,这个新对象中的属性和原对象中的属性完全相同。但是其中的引用数据类型并没有分配新的内存,而是直接指向被复制属性的内存地址。
在Java中,clone方法来自于父类Object中,具体原型类只需要实现Cloneable接口就能完成对象的浅克隆。
深克隆
通过原有对象创建一个新对象,其中所有属性都会被克隆,开辟新的内存空间,而不是指向原有内存地址。
因此我们需要重写clone方法,将将引用类型