用23種設計模式打造一個cocos creator的游戲框架----(五)工廠方法模式

1、模式標準

模式名稱:工廠方法模式

模式分類:創建型

模式意圖:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。

結構圖:

適用于:

1、當一個類不知道它所必須創建的對象的類的時候

2、當一個類不希望由它的子類來指定它所創建的對象的時候

3、當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。

2、分析與設計?

游戲中我們經常會創建一些單位對象,這些單位對象一般數量都比較大,比如士兵,地板,特效等等

而且這些單位都有一個特點,就是需要有一個“單位池”來進行回收再利用。在這個游戲框架中所有的單位都統稱為Item。管理這些的工廠叫ItemManager。比如生產單位:UnitItem,工廠為UnitItemManager,生產特效單位EffectItem,工廠為EffectItemManager

3、開始打造

import { IItem } from "./IItem";export interface IItemManager {createItem(itemNo: string): IItemremoveItem(item: IItem): void
}

?

export class UnitItemManager implements IItemManager {nextItemId = 0;generateUnitItemId(): number {return this.nextItemId++;}// 設計模式1(工廠方法)createItem(unitNo: string): UnitItem {let nodepool = xhgame.nodes.nodepools.get(unitNo);if (nodepool == null) {nodepool = new NodePool();xhgame.nodes.nodepools.set(unitNo, nodepool);}let node: Node;if (nodepool.size() == 0) {let prefab = resources.get(xhgame.prefab.UnitSpineItem, Prefab)node = instantiate(prefab);} else {node = nodepool.get()!;}let unitItem = node.getComponent(UnitItem);unitItem.unitNo = unitNounitItem.itemId = this.generateUnitItemId()return unitItem as UnitItem;}removeItem(unitItem: UnitItem<IUnitItemAttr>) {//壓入緩存池管理節點let nodepool = xhgame.nodes.nodepools.get(unitItem.unitNo);if (nodepool) {nodepool.put(unitItem.node);}unitItem.reset()unitItem.node.removeFromParent();}
}

?

export interface IItem {itemId: numberreset()
}

?

export class UnitItem extends Component implements IItem {itemId:number reset()
}

4、開始使用

let unitNo = 'shibing_001'
let unitItemManager = new UnitItemManager()
let unitItem = unitItemManager.createItem(unitNo)
unitItem.move()
unitItemManager.remove(unitItem)

類似的工廠方法模式還有?effectItemManager(特效工廠)goodsItemManager(物品工廠)tiledItemManager(地板工廠)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208210.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

failed to install plugin grafana 插件安裝失敗

升級時忽略plugins 權限問題&#xff0c;導致安裝插件失敗&#xff01;調整權限即可

042:el-table表格表頭自定義高度(親測好用)

第042個 查看專欄目錄: VUE ------ element UI 專欄目標 在vue和element UI聯合技術棧的操控下&#xff0c;本專欄提供行之有效的源代碼示例和信息點介紹&#xff0c;做到靈活運用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安裝、引用&#xff0c;模板使…

Shrio 安全框架

目錄 前言 1.介紹 2.整合 Shiro 到 Spring Boot 3.Shiro 相關配置 總結 前言 幾乎所有涉及用戶的系統都需要進行權限管理&#xff0c;權限管理涉及到一個系統的安全。Spring Boot 的安全框架整合方案中還有一個璀璨的明珠&#xff1a;Shrio。 1.介紹 Shiro是一款由Java 編…

信道復用技術

目錄 一、頻分復用FDM&#xff08;Frequency Division Multiplexing&#xff09; 二、波分復用 WDM&#xff08;Wavelength Division Multiplexing&#xff09; 三、時分復用TDM&#xff08;Time Division Multiplexing&#xff09; 四、統計時分復用 STDM&#xff08;Statisti…

雙通道5V高細分步進電機驅動芯片應用于搖頭機,X,Y控制,聚焦控制,CAMERA云臺控制等產品上的芯片選型分析

雙通道5V高細分步進電機驅動芯片GC6106&#xff0c;GC6107&#xff0c;GC6119&#xff0c;GC6151&#xff0c;GC6236&#xff0c;GC6225&#xff0c;GC6129&#xff0c;電壓范圍3~5.5V&#xff0c;最大持續電流可達0.6A左右。可應用于搖頭機&#xff0c;X,Y控制&#xff0c;聚焦…

安裝vue環境

1.Hello Vue.js <script src"https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>/*引入js文件 */ <script> new Vue({ /* 創建一個對象&#xff0c;兩個屬性。 */ el: #app, data: { message: Hello Vue.js! }, methods: { details: f…

C++使用模板的注意事項

兩點注意事項 自動推導類型&#xff0c;必須推導出一致的數據類型T&#xff0c;才可以使用模板必須要確定出T的數據類型&#xff0c;才可以使用 #include<iostream> using namespace std;//第一點必須一致的數據類型 template <class T> void myswap(T& a, T…

基于AIS數據的船舶密度計算與規律研究

參考文獻&#xff1a;[1]陳曉. 基于AIS數據的船舶密度計算與規律研究[D].大連海事大學,2021.DOI:10.26989/d.cnki.gdlhu.2020.001129. 謝謝姐姐的文章&#xff01; 網格化AIS數據 網格化 AIS 數據是處理和分析船舶軌跡數據的一種有效方法&#xff0c;特別是當涉及到密度計算和…

C++_對C數據類型的擴展

結構體 c中定義結構體變量&#xff0c;可以省略struct關鍵字 c結構提重可以直接定義函數&#xff0c;謂之成員函數&#xff08;方法&#xff09; #include <iostream> using namespace std; struct stu {int num;char name[24];void price(void) {cout << "…

Vue3+Antd實現彈框顯示內容并加入復制按鈕

使用Vue3antd實現點擊彈框出現內容并可復制內容的功能&#xff1a; HTML部分&#xff1a; <a-button type"primary" click"showModel">打開彈框 </a-button><!-- ok 是彈框中確定按鈕的操作&#xff0c;cancel 是彈框中取消按鈕的操作 --…

Redis數據已經刪除了,為什么內存占用還是很高?

Redis數據已經刪除了&#xff0c;為什么內存占用還是很高&#xff1f; Redis做了數據刪除操作&#xff0c;為什么使用top命令時&#xff0c;還是顯示Redis占了很多內存&#xff1f; 沒做相關功課的人覺得這個問題有問題&#xff0c;刪了數據還說占著內存&#xff0c;面試官不…

【學一點兒前端】真機調試本地公眾號網頁項目

前言 微信公眾號網頁開發的真機調試一直是很頭疼的事情。 原因一 微信公眾號配置的JS安全域名只有三個&#xff0c;一個大中型的公眾號這三個JS安全域名都是生產的域名&#xff0c;不可能預留域名用于開發和調試。 原因二 在微信里面只有訪問正確的安全域名才能調用wx.config用…

vuepress-----18、圖片縮放

圖片引入兩種方式 地址 # 圖片縮放插件 # 實戰 md文件引入圖片 <img class"zoom-custom-imgs" :src"$withBase(/favicon.ico)" alt"favicon">安裝配置插件 vuepress/medium-zoom: {selector: img.zoom-custom-imgs,},效果展示

AI:89-基于卷積神經網絡的遙感圖像地物分類

?? 本文選自專欄:人工智能領域200例教程專欄 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶有在本地跑過的核心代碼,詳細講解供大家學習,希望可以幫到大家。歡迎訂閱支持,正在不斷更新…

MVCC是什么

程序員的公眾號&#xff1a;源1024&#xff0c;獲取更多資料&#xff0c;無加密無套路&#xff01; 最近整理了一波電子書籍資料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虛擬機》&#xff0c;《重構改善既有代碼設計》&#xff0c;《MySQL高性能-第3版》&…

ChibiOS簡介1/5

ChibiOS簡介1/5 1. 源由2. ChibiOS基礎知識1/52.1 Chapter 1 - Introduction2.1.1 Priciple&#xff08;設計原則&#xff09;2.1.2 Fundamental requirements&#xff08;基本需求&#xff09; 2.2 Chapter 2 - Real Time Systems Concepts2.2.1 System&#xff08;系統&#…

flutter TextPainter 的用法

本文章基于 Flutter 3.16.2 Dart SDK 3.2.2。 TextPainter 是 Flutter 中用于在 Canvas 上繪制文本的類。它允許您在自定義的 CustomPainter 中使用 drawText 方法來繪制文本&#xff0c;并可以控制文本的位置、顏色、字體等屬性。 import package:flutter/material.dart;cla…

【NEON】學習資料匯總

一、資料鏈接 Guide &#xff1a; http://www.heenes.de/ro/material/arm/DEN0018A_neon_programmers_guide_en.pdf csdn博文1&#xff0c;基礎案例&#xff1a; https://blog.csdn.net/kakasxin/article/details/103912832? csdn博文2&#xff0c;內部函數&#xff1a; ht…

css 輸入框動態特效

先上圖 代碼 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 輸入框動效</title><style>.inputBox {position: relative;width: 250px;}.inputBox input {width: 100%;padding: 10px…

使用git push太慢怎么辦

使用git push太慢怎么辦 修改host文件&#xff1a; windows 的路徑應該在 C:\Windows\System32\drivers\etc\hosts 在host文件的最后一行加上 151.101.72.249 github.global.ssl.fastly.nethost不允許修改就復制一份&#xff0c;修改好了再替換掉&#xff0c;可能會讓你輸入…