SlideShare une entreprise Scribd logo
1  sur  66
Design Pattern
Kevin Yen Kevin.K.Li@newegg.com
Kuanwei Chen KuanWei.K.Chen@newegg.com
Shawn Wu Shawn.S.Wu@newegg.com
大綱
• Design Pattern
• Builder Pattern
• Flyweight Pattern
• Factory Pattern
• Decorator Pattern
• Singleton Pattern
• Observer Pattern
Design Pattern
• 創建模式(Creational)
有效率的產生、管理與操作物件
• 結構模式(Structural)
物件之間的繼承、實現與依賴關係
• 行為模式(Behavioral)
物件之間的合作行為,構成了程式最終的行為
Design Pattern
• 在物件導向設計階段採用的模式稱為Design
Pattern
• 描述在各種不同狀態下,要怎麼解決問題的一
種方法
• Design Pattern優點
 使系統架構更優良、更快完成
 對於後續測試、維護都有很大的幫助
Builder Pattern
建構者模式Builder
將複雜對象的建造過程抽象出來
使這個抽象過程的不同實現方法可以構造出不同表現
(屬性)的對象
建構者模式Builder
• 產生方式(物件)
• 如何做出來的(類別)
• 材料(建構子的參數)
• 做法(程式設計)
• 類別
• 類別
• 建構子
• 類別
• 建構子
.想要做出不同的包子
好好的認識我寫的建構子就好了嗎?
好好的認識我寫的建構子就好了嗎?
• 有很多時候,我們是沒有肉包類別的原始碼的
我們直接在開發工具中選擇建構一個物件時,
那這時就要一個個檢視,我該用那一個建構子才能做出
我想要的肉包
認識這個類別的成本是很高的
學會這個類別的文件就會弄了阿
學會這個類別的文件就會弄了阿
• 我只是單純的想要個普通的物件,但卻要花時間
先瞭解物件的建構子
Builder的精神
• Builder要的是物件產生的過程
不是Java的多型
Flyweight Pattern
享元模式
• 共享物件
• 用來儘可能減少記憶體使用量以及分享資訊給儘
可能多的相似物件
• 當系統中存在大量相同或者相似的對象時
享元模式是一種較好的解決方案,
內部狀態:
在享元對象內部不隨外界環境改變而改變的共享部分。
外部狀態:
隨著環境的改變而改變,不能夠共享的狀態就是外部狀
態
形狀 抽象方法
形狀 抽象方法
繪製圓形的具體類
• 享元工廠類的作用在於提供一個用於存儲享元對象的享元池
用戶需要對象時,首先從享元池中獲取
如果享元池中不存在,則創建 一個新的享元對象返回給用戶
並在享元池中保存該新增對象
享元模式的核心
享元工廠FlyweightFactory
享元工廠
若shape==null表示不存在,則新建 並保持到Pool中
典型的享元工廠
//定義一個HashMap用於存儲享元對象,實現享元池
//如果對象存在,則直接從享元池獲取
//如果對象不存在,先創建一個新的對象添加到pool 然後返回
Factory
工廠模式
Factory要做什麼
Simple Factory
降地類別的耦合性
Factory Method
產生物件交給子類別決定
舉個例子
pokemon
共同特性
1-名稱
2-類型
3-能力
pokemon
(interface)
小火龍 皮卡丘
工廠
Simple Factory
新增時…
pokemon
(interface)
小火龍 皮卡丘
工廠
傑尼龜
OO 應遵守
類別應該開放便於擴充、應該關閉禁止修改
pokemon
(interface)
小火龍 皮卡丘
工廠方法
(interface)
小火龍工廠 皮卡丘工廠
Factory Method
pokemon
(interface)
小火龍 皮卡丘
工廠生產方法
(interface)
小火龍工廠 皮卡丘工廠
Factory Method
Factory Method
小火龍工廠
new
Monster A
pokemon
(interface)
小火龍特性 皮卡丘特性
工廠生產方法
(interface)
小火龍工廠 皮卡丘工廠
傑尼龜特性
傑尼龜工廠
Decorator Pattern
裝飾者模式
有時繼承並非最好的選擇
pokemon
(interface)
小火龍 皮卡丘
皮卡丘+電
擊+噴火
小火龍+水
槍
皮卡丘+噴
火+水槍
皮卡丘+電
擊+水槍
小火龍+電
擊
Decorator宗旨
要為物件新增功能時,以組合的方式為物件新增而
非繼承。
pokemon
pokemonA Skill
電擊 水槍 噴火
Decorator架構
pokemon
pokemonA Skill
電擊 水槍 噴火
Decorator架構
多層裝飾
pokemon
pokemonA Skill
電擊 水槍 噴火
新增skill
New Skill
Singleton Pattern
要管理資源或是避免多個類別分享相同資源引
發 Race condition
Singleton
Instance
Object Object Object Object
Race Condition
• 在同一時間只有一個class在系統執行時,只有一個
實體(instance)產生
• 這個class必須要提供一個public的method讓別的class
取得自己的實體
Singleton
Instance
Object Object Object Object
getInstance()
判斷Instance是否存在
判斷Instance是否存在,不存在則new一個新的Instance
49
使用synchronized防止產生多個實體
50
51
Observer Pattern
News
Reader Reader Reader
當物件(object)間的有一對多(one-to-many)關係
時,可利用Observer pattern來設計
當一個物件的狀態(state)發生變化時,所相依的
所有物件都可以自動地收到通知的狀況
News
Reader Reader Reader
Update
State
Notify
News
Observable
implement
Reader
Observer
implement
SetLatestNews
notify
register
unregister
update
read
subscribe
unsubscribe
程式架構
Interface
56
訂閱方法subscribe(),用來訂閱News
訂閱新聞則此讀者會被註冊
取消訂閱方法unsubscribe(),用來取消訂閱News
取消訂閱新聞則此讀者會被取消註冊
57
更新方法 update(),當News的狀態更新時
News會藉由此方法通知Reader
閱讀方法 read(),依照News的狀態來閱讀新聞
58
查看更新狀態方法isLatesNews()
成員變數latestNews代表News的狀態,若為true表示最新
false為舊的新聞
當呼叫setLatestNews()時會更改News的狀態
進而呼叫notify()方法去通知readerList中的所有讀者
59
註冊方法regsiter(),當讀者訂閱新聞時
該讀者會被加入讀者名單(readerList)
取消註冊方法unregister(),當讀者取消訂閱時
該讀者會從讀者名單(readerList)中移除
60
通知方法notify(),在News的狀態更動時
會被呼叫來通知並更新所有的讀者
61
已註冊讀者名單
當讀者john取消訂閱,則新聞update時
62
john重新訂閱新聞,則新聞update時
News狀態更新至Old News
63
參考文獻
• Design Pattern
 O’Reilly Media, Inc. Taiwan Branch: Design Pattern新解
 維基百科
 GitBook:DesignPattern
• Builder Pattern
 Android綠豆湯: 我所認識的Builder設計模式
 SourceMaking: Builder Design Pattern
參考文獻
• Flyweight Pattern
 Programering: Design patterns of reading notes, Flyweight
 設計模式之Flyweight(享元)
 Byronlee: 設計模式-享元模式
參考文獻
• Singleton Pattern
• 程式札記:[OO 設計模式] Singleton Patterns : 確保同一時間只有一個
實例或物件進行服務
• Observer Pattern
• 痞客邦: Java Observer Pattern 觀察者模式 BY菲比&肉豬的生活分享

Contenu connexe

En vedette

Swift, opportunités et perspectives du dernier langage d'Apple
Swift, opportunités et perspectives du dernier langage d'AppleSwift, opportunités et perspectives du dernier langage d'Apple
Swift, opportunités et perspectives du dernier langage d'AppleDamien GOSSET
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en JavaOussama BEN KHIROUN
 
Visitor Pattern
Visitor PatternVisitor Pattern
Visitor PatternIder Zheng
 
01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)TECOS
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
Chp6 - Développement iOS
Chp6 - Développement iOSChp6 - Développement iOS
Chp6 - Développement iOSLilia Sfaxi
 
Chp2 - Conception UX-UI des Applications Mobiles
Chp2 - Conception UX-UI des Applications MobilesChp2 - Conception UX-UI des Applications Mobiles
Chp2 - Conception UX-UI des Applications MobilesLilia Sfaxi
 
Chp5 - Applications Android
Chp5 - Applications AndroidChp5 - Applications Android
Chp5 - Applications AndroidLilia Sfaxi
 
Chp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications MobilesChp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications MobilesLilia Sfaxi
 
Chp1 - Introduction au Développement Mobile
Chp1 - Introduction au Développement MobileChp1 - Introduction au Développement Mobile
Chp1 - Introduction au Développement MobileLilia Sfaxi
 
Design Patterns (2003)
Design Patterns (2003)Design Patterns (2003)
Design Patterns (2003)Pascal Roques
 
Introduction aux design patterns
Introduction aux design patternsIntroduction aux design patterns
Introduction aux design patternsclem_simon
 
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...ENSET, Université Hassan II Casablanca
 
patron de conception
patron de conception patron de conception
patron de conception Shili Mohamed
 
Developper une application mobile
Developper une application mobileDevelopper une application mobile
Developper une application mobileEutech SSII
 

En vedette (17)

Swift, opportunités et perspectives du dernier langage d'Apple
Swift, opportunités et perspectives du dernier langage d'AppleSwift, opportunités et perspectives du dernier langage d'Apple
Swift, opportunités et perspectives du dernier langage d'Apple
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en Java
 
Visitor Pattern
Visitor PatternVisitor Pattern
Visitor Pattern
 
01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Chp6 - Développement iOS
Chp6 - Développement iOSChp6 - Développement iOS
Chp6 - Développement iOS
 
Chp2 - Conception UX-UI des Applications Mobiles
Chp2 - Conception UX-UI des Applications MobilesChp2 - Conception UX-UI des Applications Mobiles
Chp2 - Conception UX-UI des Applications Mobiles
 
Chp5 - Applications Android
Chp5 - Applications AndroidChp5 - Applications Android
Chp5 - Applications Android
 
Chp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications MobilesChp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications Mobiles
 
Chp1 - Introduction au Développement Mobile
Chp1 - Introduction au Développement MobileChp1 - Introduction au Développement Mobile
Chp1 - Introduction au Développement Mobile
 
Design Patterns (2003)
Design Patterns (2003)Design Patterns (2003)
Design Patterns (2003)
 
Jcom02.ppt
Jcom02.pptJcom02.ppt
Jcom02.ppt
 
Mobile design
Mobile designMobile design
Mobile design
 
Introduction aux design patterns
Introduction aux design patternsIntroduction aux design patterns
Introduction aux design patterns
 
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
 
patron de conception
patron de conception patron de conception
patron de conception
 
Developper une application mobile
Developper une application mobileDevelopper une application mobile
Developper une application mobile
 

Similaire à Design Pattern

我們與Azure DevOps的距離
我們與Azure DevOps的距離我們與Azure DevOps的距離
我們與Azure DevOps的距離Edward Kuo
 
2016.8.1 Design Pattern Eric
2016.8.1 Design Pattern Eric2016.8.1 Design Pattern Eric
2016.8.1 Design Pattern Eric柏亨 盧
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷oulan
 
Agile introduction
Agile introductionAgile introduction
Agile introductionJen-Chieh Ko
 
Scrum深入淺出
Scrum深入淺出Scrum深入淺出
Scrum深入淺出Taien Wang
 
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器Chieh Kai Yang
 
Agile development
Agile developmentAgile development
Agile developmentSway Wang
 
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Kirk Chen
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comdrewz lin
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comdrewz lin
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?Kirk Chen
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例Will Huang
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updatedPaul Chao
 
设计师转型培训-工具篇
设计师转型培训-工具篇设计师转型培训-工具篇
设计师转型培训-工具篇Robert Luo
 
從教具設計看產品創新 - From UX in the Jungle to Innova Café
從教具設計看產品創新 - From UX in the Jungle to Innova Café從教具設計看產品創新 - From UX in the Jungle to Innova Café
從教具設計看產品創新 - From UX in the Jungle to Innova CaféDer-Jeng Lin
 
微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open Camp微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open CampAndrew Wu
 

Similaire à Design Pattern (20)

我們與Azure DevOps的距離
我們與Azure DevOps的距離我們與Azure DevOps的距離
我們與Azure DevOps的距離
 
2016.8.1 Design Pattern Eric
2016.8.1 Design Pattern Eric2016.8.1 Design Pattern Eric
2016.8.1 Design Pattern Eric
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷
 
SCRUM
SCRUMSCRUM
SCRUM
 
Agile introduction
Agile introductionAgile introduction
Agile introduction
 
Scrum深入淺出
Scrum深入淺出Scrum深入淺出
Scrum深入淺出
 
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
 
Agile development
Agile developmentAgile development
Agile development
 
軟體架構模式
軟體架構模式軟體架構模式
軟體架構模式
 
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.com
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.com
 
UiGathering 2012.07 Slide (Derek Liu)
UiGathering 2012.07 Slide (Derek Liu)UiGathering 2012.07 Slide (Derek Liu)
UiGathering 2012.07 Slide (Derek Liu)
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
 
设计师转型培训-工具篇
设计师转型培训-工具篇设计师转型培训-工具篇
设计师转型培训-工具篇
 
從教具設計看產品創新 - From UX in the Jungle to Innova Café
從教具設計看產品創新 - From UX in the Jungle to Innova Café從教具設計看產品創新 - From UX in the Jungle to Innova Café
從教具設計看產品創新 - From UX in the Jungle to Innova Café
 
微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open Camp微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open Camp
 

Plus de newegg

互聯網產品運營
互聯網產品運營互聯網產品運營
互聯網產品運營newegg
 
如何快速將Ui設計流程套入新專案
如何快速將Ui設計流程套入新專案如何快速將Ui設計流程套入新專案
如何快速將Ui設計流程套入新專案newegg
 
Androidaop 170105090257
Androidaop 170105090257Androidaop 170105090257
Androidaop 170105090257newegg
 
Google play加入測試人員步驟
Google play加入測試人員步驟Google play加入測試人員步驟
Google play加入測試人員步驟newegg
 
Test flight內部測試
Test flight內部測試Test flight內部測試
Test flight內部測試newegg
 
Hybridapp 161209030125
Hybridapp 161209030125Hybridapp 161209030125
Hybridapp 161209030125newegg
 
Boxtream tools-161106062349
Boxtream tools-161106062349Boxtream tools-161106062349
Boxtream tools-161106062349newegg
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearchnewegg
 
使用者行為分析
使用者行為分析使用者行為分析
使用者行為分析newegg
 
Software project management
Software project managementSoftware project management
Software project managementnewegg
 
Ab Testing
Ab TestingAb Testing
Ab Testingnewegg
 
Growth Hacking
Growth HackingGrowth Hacking
Growth Hackingnewegg
 
App程式上架google play流程
App程式上架google play流程App程式上架google play流程
App程式上架google play流程newegg
 
How to Use Git?
How to Use Git?How to Use Git?
How to Use Git?newegg
 

Plus de newegg (14)

互聯網產品運營
互聯網產品運營互聯網產品運營
互聯網產品運營
 
如何快速將Ui設計流程套入新專案
如何快速將Ui設計流程套入新專案如何快速將Ui設計流程套入新專案
如何快速將Ui設計流程套入新專案
 
Androidaop 170105090257
Androidaop 170105090257Androidaop 170105090257
Androidaop 170105090257
 
Google play加入測試人員步驟
Google play加入測試人員步驟Google play加入測試人員步驟
Google play加入測試人員步驟
 
Test flight內部測試
Test flight內部測試Test flight內部測試
Test flight內部測試
 
Hybridapp 161209030125
Hybridapp 161209030125Hybridapp 161209030125
Hybridapp 161209030125
 
Boxtream tools-161106062349
Boxtream tools-161106062349Boxtream tools-161106062349
Boxtream tools-161106062349
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 
使用者行為分析
使用者行為分析使用者行為分析
使用者行為分析
 
Software project management
Software project managementSoftware project management
Software project management
 
Ab Testing
Ab TestingAb Testing
Ab Testing
 
Growth Hacking
Growth HackingGrowth Hacking
Growth Hacking
 
App程式上架google play流程
App程式上架google play流程App程式上架google play流程
App程式上架google play流程
 
How to Use Git?
How to Use Git?How to Use Git?
How to Use Git?
 

Design Pattern