1. 程式人生 > 其它 >04-03-設計模式 原型模式

04-03-設計模式 原型模式

克隆羊問題

現在有一隻羊Tom, 姓名: Tom 年齡: 1, 顏色為白色, 編寫程式建立 和 Tom 羊屬性完全相同的10只羊

傳統方式解決

思路分析

程式碼

package com.dance.design.designmodel.ysms;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class yxms {
    public static void main(String[] args) {
        Sheep sheep = new Sheep("tom", 1, "白色");
        List<Sheep> collect = IntStream.range(0, 10).mapToObj(x -> sheep.clone()).collect(Collectors.toList());
        System.out.println(collect);
    }
}
class Sheep implements Cloneable{
    String name;
    Integer age;
    String color;

    public Sheep(String name, Integer age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    @Override
    public Sheep clone() {
        try {
            return (Sheep) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

額, 我並沒有像視訊中那樣寫, 我知道JDK中有Cloneable這個介面, 實現了應該就可以實現克隆的

原型模式介紹

  1. 原型模式是指,用原型例項指定物件建立的種類,並且通過拷貝這些原型,建立新的物件
  2. 原型模式是一種建立型設計模式, 允許一個物件再建立另一個可定製的物件, 無需知道如何建立的細節
  3. 工作原理是: 通過將一個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝他們自己來實施建立 即物件.clone()
  4. 其實就是影印

原型模式類圖

原理結果圖說明

  1. Prototype: 原型類, 宣告一個克隆自己的介面
  2. ConcretePrototype: 具體的原型類, 實現一個克隆自己的操作
  3. Client: 讓一個原型物件克隆自己, 從而建立一個新的物件(屬性一樣)

原型模式解決克隆問題

使用原型模式改進傳統方式問題, 讓程式具有更高的效率和擴充套件性

程式碼

我靠, 看到程式碼的時候, 直接給我搞破防了, 原來我TM上面寫的就是原型模式, 難不成我已經進入第五層了?

原始碼剖析

Spring框架中的應用

在SPring中多利Bean就是通過原型模式實現的

深拷貝與淺拷貝

深拷貝

就是物件依賴物件, 而不是基本資料型別

大概就是這樣的情況

在呼叫拷貝方法的時候,依賴物件也應該是建立新的,引用也應該改變

  • 實現方法
  • 自己寫
  • JSON 來回轉換

淺拷貝

就是我們當前實現的Cloneable介面,直接呼叫父類的clone方法, 如果沒有重寫過,那麼就是淺拷貝, 只會拷貝基本型別, 引用型別是直接賦值的

  • 實現方法
  • 自己寫
  • 實現Cloneable介面

我不想過多寫這個這個東西,大家知道怎麼實現就行了

原型模式的注意事項和細節

  1. 建立新的物件比較複雜時, 可以利用原型模式簡化物件的建立過程,同時也能提高效率
  2. 不用重複初始化物件, 而是動態的獲取物件執行時狀態
  3. 如果原始物件發生變化(增加或減少屬性), 其他克隆物件的也會發生響應的變化, 無需修改程式碼
  4. 在實現深度克隆的時候可能需要比較複雜的程式碼
  5. 缺點
    1. 需要為每一個類配備一個克隆方法,這對全新的類來說不是很難, 但是對已有的類進行改造時,需要修改其原始碼, 違背了OCP原則, 這點需要注意