iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

掘地土撥鼠的設計歷險記系列 第 6

Prototype Pattern - 原型模式

  • 分享至 

  • xImage
  •  

Introduction

想像你正在製作一個遊戲,遊戲中有許多相同種類的怪物。如果每次你需要一個新怪物時都從頭創建一個新的怪物物件,將需要很多的時間和資源。而如果你已經有了一個怪物物件,你可以用它作為原型,複製出新的怪物,這樣可以節省很多創建和初始化的時間和資源。

原型模式中的角色有以下幾種:

  • Prototype: 定義 Clone()的複製方法
  • Concrete Prototype: 實作Clone()
  • Client

UML 關係圖

https://ithelp.ithome.com.tw/upload/images/20230904/201150823ga3fDQhjW.jpg

使用場景

  • 當開發者需要把系統中的類別數量保持在最少時,如果子類別之間的區別僅在於初始化的方式不同,則可以使用此模型減少子類別的數量。
  • 需要在運行時實體化類別,且使用端沒有實體化上的需求,只需要找到合適的原型來複製,則可使用原型模式。

雛形演練

Prototype & ConcretePrototype

package prototype

type Prototype interface {
	GetName() string
	Clone(name string) Prototype
}

type ConcretePrototype struct {
	Name string
}

func (p *ConcretePrototype) GetName() string { return p.Name }

func (p *ConcretePrototype) Clone(name string) Prototype {
	return &ConcretePrototype{p.Name + " " + name}
}

Main

package main

import (
	"fmt"
	prototype "prototype/Prototype"
)

func main() {

	proto := prototype.ConcretePrototype{Name: "Concrete Prototype"}

	clone := proto.Clone("Concrete Prototype Clone")

	fmt.Println("proto: ", proto.GetName())
	fmt.Println("clone: ", clone.GetName())

}

優缺點比較

優點

  • 快速複製物件: prototype 可以快速地創建新物件的克隆版本,相較於逐一設定每個新物件要快。
  • 節省資源:當物件的創建過程需要大量的計算或資源時,複製現有物件會節省大量資源。
  • 動態新增/刪除屬性:prototype 允許在運行時動態新增或刪除對象的屬性,增加了程式的靈活性。
  • 降低複雜度:在某些情況下,可以避免創建複雜的初始化過程,降低系統的複雜度。

缺點

  • 複製問題:如果要複製的物件有引用到其他物件的屬性,則只會引用而不是實際對象,可能會造成未預期的錯誤。
  • 複雜對象的複製困難:對於那些有多層對象或包含循環參照的物件,複製會變得非常複雜。
  • 維護困難:如果prototype 的結構變化,則所有的克隆物件都可能需要相應的調整,增加了維護的困難度。

上一篇
Builder Pattern - 生成器模式 實際應用
下一篇
Prototype Pattern - 實際應用
系列文
掘地土撥鼠的設計歷險記11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言