HafuHafu

  • 首页
  • 技术
    • 编程
    • 教程
  • 资源
  • 综合
    • 杂谈
  • ACG
    • Anime & Comic
    • Game
  • 用户中心
    • 登录
  1. 首页
  2. 编程
  3. 正文

2.原型模式

2019-09-18 1295点热度 0人点赞 0条评论

原型模式用于创建重复的对象,属于创建型模式。
它通过一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的方式来创建出更多相同类型的对象。

目录

  • 包含
  • 要求
    • 浅克隆
    • 深克隆

包含

  1. 抽象原型类:原型对象必须实现的接口。
  2. 具体原型类:实现抽象原型类中的方法,它就是可以被克隆的对象。
  3. 访问类:使用具体原型类中的clone方法来克隆对象。
/**
 * 具体原型类
 * 其实现的Cloneable接口就是抽象原型类
 * @author : Tang
 * @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 : Tang
 * @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方法,将将引用类型

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Java 设计模式
最后更新:2020-11-27

hafuhafu

将思绪寄托于流逝而过的日子里。

点赞
< 上一篇
下一篇 >

文章评论

取消回复

hafuhafu

将思绪寄托于流逝而过的日子里。

文章目录
  • 包含
  • 要求
    • 浅克隆
    • 深克隆

COPYRIGHT © 2022 HafuHafu. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang