2.原型模式

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

包含

  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方法,将将引用类型

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇