子墨對酒《三國殺》裡論模式 一 工廠模式

2021-06-20 08:43:17 字數 2576 閱讀 9732

有人說模式會讓**變的優雅,也有人說模式會讓你的**更利於擴充套件。我個人覺得這些說的都對。但是濫用模式一樣會成為被人詬病的痛點。與其說物件導向語言考察的主要標準是語法,不如考察對模式的理解更加切合實際。很大一部分人都覺得模式枯燥無味,但其實模式是一些充滿智慧型的集合,可以用在任何的領域,本系列文章就是希望在一種新新的角度裡看模式。《三國殺》一直是我熱衷的遊戲之一,當然外界對它褒貶不一我們不作深究。我相信很少有人把模式和遊戲聯絡起來,不過我還是願意開這個先例,如果你覺得我的方式並不賴,不妨跟我一起**,我很願意和一些志同道合的人聊這些東西,當然不限制於任何的學科。雖然市面上關於模式的文章非常多,但是我還是願意跟大家老生長談一下。這次我們說工廠模式。很多人覺得工廠模式再簡單不過了,但是實際上能用的好的人往往很少,而且工廠模式也常常伴隨著其他模式出現,這種復合的模式你又是否能夠掌握的很好呢?

很多人認為工廠模式的重點在與構造,但我認為工廠模式重點在於抽象。抽象你的產品比你創造乙個工廠要困難的多。其實工廠模式的存在是控制反轉的一種體現。將構造和**分離,這種實現能有效的分離實現,提高擴充套件性。比較傳統的比喻就是100個人吃乙個產家的麵包,當他們打算換一種品牌的時候。採用工廠模式我們只需要變更工廠就行,而不採用控制反轉的方式就像是100個人自己去買麵包。

當然你一時很難將這兩種場景抽象組合起來。那麼我們在說工廠模式之前我們不妨先說一下ioc(控制反轉)。我們先寫一段非控制反轉的**:

bread a1 = new bread_味多美();

假如我們買"味多美"的麵包,用這種非ioc的寫法,假如說我們有一百個類都採用這種寫法,相當於100個人都持有這個麵包,這時候我們發現」味多美「有問題。那怎麼辦呢?我們只能改這一百個類。所以看出問題了麼?~如果麵包的種類是多變的那怎麼辦呢?~這裡我們不提工廠,只說ioc,我們將這種控制反轉的集合類稱為ioc容器。

bread a = ioc.createbread();

當我們要換成其他的品牌的時候,我們只需要修改ioc容器乙個類的**即可。不知道這樣大家能否跟我一樣理會ioc的重要性。好的,如果你已經理解了ioc,我們回頭來說一下factory模式。

工廠主要分成簡單工廠,靜態工廠,萬能工廠,抽象工廠。但實際上如果你理解了ioc的概念,寫法這種東西沒有什麼重要之處,只要你覺得那種寫法適合你就行。

所謂簡單工廠是工廠最簡單的一種寫法,但是工廠本身是乙個物件。靜態工廠與簡單工廠相對的,不需要定義工廠物件,而如果從產品種類來說的話,如果你的產品都由同乙個工廠產生,那便是萬能工廠。抽象工廠是對ioc之上的又一層抽象。對工廠的抽象,可以理解成是工廠的工廠。

為何我要著重講ioc容器呢?因為很多模式都是充斥著ioc的概念,好吧~我們在三國殺這個遊戲裡面找找工廠模式的影子吧。

我們如果只定義牌的元資料的話實際上我們可以得到這樣的資料結構:

class card      

當然每乙個card都有乙個效果,我們將在以後分析這種效果物件。這裡我們繼續回到剛才的問題,偉什麼要使用工廠模式?或者說為什麼要使用ioc呢?

首先,我們所看到的這個介面是不可能一成不變的。假如說我要將「桃」這個物件的某些屬性變更,比如說是影象,或者是名字,字型,說明等等。如果我們用傳統new的方式改起來的工作量是非常大的。而你如果採用ioc進行反轉的話,你就會發現,只需要變更你的工廠類就可以了。當然我們這裡要丟擲來一些問題。乙個牌局來說牌數是永遠不可能增減的。那麼你的牌被**以後有沒有必要重新再new出來一張新的牌呢?~答案明顯是否定的。那麼這就引出另外乙個模式享元模式。我將在後面跟大家說明一下這個模式,這個模式也是ioc的一種體現,大量的緩衝池**都用到這種模式。好的我們構造了這些物件我們要對這些卡片附加一些效果。我們展示將這些效果抽象成乙個image魔法物件:

class image

class 桃 extends image }

我們知道對於桃這種東西來說不論是卡1還是卡2,都是一樣的image效果,那既然這樣根本就沒有必要對每乙個卡片定義專門的效果物件。我們在card物件裡面增加乙個方法:

class card

我們完全可以定義乙個桃物件:

桃  t = new 桃();

然後將它放到定義好的卡片物件中去:

card card1 = new card(「紅桃a」);

card1.addeffect(t);

card2 = new card(「紅桃k」);

card2.addeffect(t);

card3 = new card(「紅桃6」);

card3.addeffect(t);

我們可以看出這種寫法不僅節省記憶體而且要簡潔的多。這其實就是聚合模式。我也會在以後的文章中**它。當然桃的生成我們就可以採用工廠模式。工廠會封裝好你的物件的生成細節。我可能生成是通過資料庫,**,甚至是雲端。我們看到其實三國殺裡面用到的很多都是工廠模式的樣例。比如英雄物件,按鈕物件,牌類物件,魔法物件,關係物件,文字物件,說明物件,裝備物件。這些都是可以通過ioc容器來生成。

--非子墨

微博賬號: 非子墨

寫個三國殺

自己老早以前就想寫個區域網的三國殺,以前思考過其遊戲邏輯的實現,覺得有點複雜,一直也沒有真正動手,上個週末,真正動手做了起來,2天裡寫了大約2000來行 算是把整個框架有了個大致的實現。下面把整個思路整理一下。既然是輕量級的區域網版本,就沒必要把伺服器和客戶端分開來做,就讓程式自帶服務端和客戶端,類...

三國殺的理解

11 人生就像一局三國殺。有可能你還沒判斷出誰是好人誰是壞人你就掛了。12 人生就像一局三國殺。你對別人好,別人不一定對你好。13 人生就像一局三國殺。你要在這個世界生存有時需要偽裝。14 人生就像一局三國殺。你可能來這個世界只是來打醬油的。15 人生就像一局三國殺。有可能一出生就已經決定了你的身份...

三國殺自走棋

這個陣法叫做五騎兵陣 首先 從協戰上來說還沒有乙個協戰是浪費的 那麼這套陣容就是攻防兼備 2群可以得到閃 而3魏則是加上一點體力上限 這是防守 那麼5騎兵就是進攻 它可以是敵人有概率無法使用閃 1 當人口 1時 最好用非五騎兵陣容裡面的人 用像袁術 周泰這種可以扛住第二回合的武將 當然 如果有二星的...